Java反射---Class对象,获得类的方法、成员变量和构造函数信息

简介: 版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/twilight_karl/article/details/73848985 Class类任何一个类都是Class类的实例,而我们常见的对象,是用普通的类实例化出来的,也就是Class类的实例的实例。
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/twilight_karl/article/details/73848985

Class类

任何一个类都是Class类的实例,而我们常见的对象,是用普通的类实例化出来的,也就是Class类的实例的实例。一个普通的类Foo的Class实例有三种表示方式:
- 1、知道类名获取Foo的Class实例
Class c1 = Foo.class;
- 2、通过Foo对象获得Foo的Class实例
Class c2 = foo.getClass();
- 3、通过forName()获得实例
Class c3 = Class.forName("test.reflect.Foo");

这三者是相等的:

System.out.println(c1 == c2&&c2 == c3);
// True 

可以用Class的实例创建Foo的实例:

Foo foo2 = (Foo)c1.newInstance();

动态加载类

1、静态加载类。编译时加载类,在编译时刻就需要加载所有的可能的使用到的类。所有的类都会加载,不管有没有被使用
2、动态加载类。运行时加载类

使用Class.forName()动态加载类

    public static void main(String [] args){
        try{
            Class c = Class.forName(args[0]);
            // OfficeUtil 是接口
            OfficeUtil obj = (OfficeUtil)c.newInstance();
            obj.print();
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }

使用了OfficeUtil接口的Word类

class Word implements OfficeUtil{
    public void print(){
        System.out.println("Word");
    }
}

使用了OfficeUtil接口的Excel类

class Excel implements OfficeUtil{
    public void print(){
        System.out.println("Excel");
    }
}

OfficeUtil接口

interface OfficeUtil{
    public void print();
}

获得类类型的信息

通过Class类的对象获得某个类的信息
- getName() 返回类类型的名称
- getSimpleName() 返回类类型的名称的简写

获得类名:

        Class c1 = int.class;
        Class c2 = String.class;
        Class c3 = void.class;
        Class c4 = double.class;
        Class c5 = Double.class;
        System.out.println(c1.getName());
        System.out.println(c2.getName());
        System.out.println(c3.getName());
        System.out.println(c4.getName());
        System.out.println(c5.getName());

结果:

    int
    java.lang.String
    void
    double
    java.lang.Double

getSimpleName()和getName():

java.lang.String    // getName()
String              // getSimpleName()

Method对象

方法也是对象,一个成员方法就是一个Method对象实例。method实例有以下常用方法:
- getReturnType() 获得返回值,返回的是 Class

    public static void printClassMethodMessage(Object obj){
        // 获得对象的类类型
        Class data = obj.getClass();
        // 获得类类型的名称
        System.out.println("类名(getName):"+data.getName());

        /**
         * Method类,一个成员方法就是一个Method对象实例。方法也是对象
         * getDeclaredMethods(); 返回所有方法,但是不包括继承的方法
         * getmethods() 返回继承的方法和自己定义的public方法
         */
        Method [] methods = data.getMethods();
        for(Method temp : methods){
            // 获得返回值类型
            Class returnType = temp.getReturnType();
            System.out.print(returnType.getSimpleName()+" ");
            // 获得方法名
            System.out.print(temp.getName()+"(");
            // 获得参数数组
            Class [] params = temp.getParameterTypes();
            for(Class param : params){
                System.out.print(param.getSimpleName()+",");
            }
            System.out.println(")");
        }
    }

测试类:

    public static void main(String[] args) {
        ClassUtil.printClassMethodMessage("bbb");
    }

结果是:

类名(getName):java.lang.String
boolean equals(Object,)
String toString()
int hashCode()
int compareTo(String,)
int compareTo(Object,)
int indexOf(String,int,)
int indexOf(String,)
int indexOf(int,int,)
int indexOf(int,)
String valueOf(int,)
String valueOf(long,)
String valueOf(float,)
String valueOf(boolean,)
String valueOf(char[],)
String valueOf(char[],int,int,)
String valueOf(Object,)
String valueOf(char,)
String valueOf(double,)
...

获得成员变量的信息

Field对象表示成员变量。每一个变量都是一个Field对象
- getFields() 获得public变量。返回Field[]
- getDeclaredFields() 获得所有变量,但不包括继承的变量 。返回Field[]
- getType获得 变量的类型。返回Class

    public static void printClassFieldMessage(Object obj){
        Class data = obj.getClass();
        // 获得所有成员变量
        Field []  fields = data.getDeclaredFields();
        for(Field field:fields){
            System.out.println(field.getType().getName() +" ");
            System.out.println(field.getName());
        }
    }

结果是:

    [C 
    value
    int 
    hash
    long 
    serialVersionUID
    [Ljava.io.ObjectStreamField; 
    serialPersistentFields
    java.util.Comparator 
    CASE_INSENSITIVE_ORDER

获得构造方法

Constructor类的实例化对象,表示构造函数

获得构造函数:

    public static void printClassConFieldMessage(Object obj){
        Class data = obj.getClass();
        // 获得所有的构造函数
        Constructor[] cons = data.getConstructors();
        for(Constructor con:cons){
            // 获得函数名
            System.out.print(con.getName()+"(");
            // 获得参数列表
            Class [] params = con.getParameterTypes();
            for(Class param : params){
                System.out.print(param.getName()+",");
            }
            System.out.println(")");
        }
    }

结果:

    java.lang.String([B,int,int,)
    java.lang.String([B,java.nio.charset.Charset,)
    java.lang.String([B,java.lang.String,)
    java.lang.String([B,int,int,java.nio.charset.Charset,)
    java.lang.String([B,int,int,java.lang.String,)
    java.lang.String(java.lang.StringBuilder,)
    java.lang.String(java.lang.StringBuffer,)
    java.lang.String([B,)
    java.lang.String([I,int,int,)
    java.lang.String()
    java.lang.String([C,)
    java.lang.String(java.lang.String,)
    java.lang.String([C,int,int,)
    java.lang.String([B,int,)
    java.lang.String([B,int,int,int,)
相关文章
|
12天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
36 17
|
5天前
|
人工智能 监控 数据可视化
Java智慧工地信息管理平台源码 智慧工地信息化解决方案SaaS源码 支持二次开发
智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管理需求,满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效,为监管平台提供数据支撑。
17 3
|
4天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
8天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
41 4
|
9天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
20 2
|
13天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
17天前
|
存储 Java 编译器
java wrapper是什么类
【10月更文挑战第16天】
21 3
|
监控 Java
Sigar java 服务器信息探针、监控
Sigar java 服务器信息探针、监控
291 0
|
6天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
2天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
15 9