反射从0到入门 (2)

Class 存放着对应类型的运行时信息。在 Java 程序运行时,Java 虚拟机为所有类型维护一个 java.lang.Class 对象。该 Class 对象存放着所有关于该对象的运行时信息。

获取 Class

那我们如何获取想要的 Class,look this Code

    public static void main(String[] args) {
        // 方式1:Object.getClass()
        // Object 类的 getClass() 方法返回一个 Class 类实例
        String name = "不是秃头的小李程序员";
        Class<?> classType = name.getClass();
        System.out.println("Object.getClass() classType: " + classType);

        // 方式2:T.Class
        // T 是任意 Java 类型
        Class<?> classType2 = String.class;
        System.out.println("T.Class classType: " + classType2);

        // 方式3:Class.forName
        try {
            Class<?> classType3 = Class.forName("java.lang.String");
            System.out.println("Class.forName classType: " + classType2);
            // 根据 className 没有找到类,会抛出 ClassNotFoundException 异常
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

获取 Class 的三种方法

getClass()

T.class

Class.forName

这三种用法需要根据具体的场景灵活去使用,比如 JDBC 获取连接的数据库类型,就通过 Class.forName(“类路径”)。

获取父类 Class

通过 getSuperclass() 方法获取父类的 Class,示例如下:

Class<?> superclass = Integer.class.getSuperclass();
System.out.println(superclass);
System.out.println(superclass.getSuperclass());
System.out.println(superclass.getSuperclass().getSuperclass());
System.out.println(superclass.getSuperclass().getSuperclass().getSuperclass());

运行结果

class java.lang.Number
class java.lang.Object
null
Exception in thread "main" java.lang.NullPointerException

可以看到 Integer 的父类是 Number,Number 的父类是 Object,Object 就没有父类了,所以在 null 之后会抛出空指针的异常。

小结

获取到想要的 Class 了,就可以获取到它的一切信息。

在获取想要的信息前,不妨先了解个知识点。

方法中带与不带「Declared」的区别

不带「Declared」的方法支持取出包括继承、公有(public)的 Field、Method 和 Constructor。

带「Declared」的方法支持取出包括当前类所有的构造函数(包括公有和私有的,不包括继承)的 Field、Method 和 Constructor。

Field 获取 Field

如何通过 Class 实例获取字段信息。Class 类提供了以下几个方法来获取字段:

Field getField(String name):根据字段名获取某个 public 的 field

Field[] getFields():获取所有 public 的 field

Field getDeclaredField(String name):根据字段名获取当前类的某个 field

Field[] getDeclaredFields():获取当前类的所有 field

快快快,show me code

public class FiledTest1 {
    public static void main(String[] args) throws NoSuchFieldException {
        Class stdClass = Student.class;
        // 获取 public 字段 "score"
        System.out.println(stdClass.getField("score"));
        // 获取继续的 public 字段 "name"
        System.out.println(stdClass.getField("name"));
        // 获取 private 字段 "grade"
        System.out.println(stdClass.getDeclaredField("grade"));
    }
}

class Student extends Person{
    public int score;
    private int grade;
}

class Person{
    public String name;
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyfwdg.html