← 返回首页
JavaSE系列教程(七十九)
发表时间:2020-02-24 13:04:20
讲解什么是反射。

1.什么是反射

JAVA反射机制(Reflection)是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

打个比方,反射就好比我们去医院做CT一样,通过CT可以观察我们的五脏六腑。

与Java反射相关的类如下:

类名 用途
Class类 代表类的实体,在运行的Java应用程序中表示类和接口
Field类 代表类的成员变量(成员变量也称为类的属性)
Method类 代表类的方法
Constructor类 代表类的构造方法
Annotation类 代表类的注解

java反射整体知识点导图如下:

2.Class对象

说到反射,首先要了解什么是Class。每个类都会产生一个对应的Class对象,一般保存在.class文件中。所有类都是在对其第一次使用时,动态加载到JVM的,当程序创建一个对类的静态成员的引用时,就会加载这个类。Class对象仅在需要的时候才会加载,static初始化是在类加载时进行的。类加载时,类加载器首先会检查这个类的Class对象是否已被加载过,如果尚未加载,默认的类加载器就会根据类名查找对应的.class文件。

使用java的反射机制必须首先要获取这个类的类对象(Class对象)。

获取类对象有以下三种方式:

实例:

通过三种方式获取Person类的类对象。

class Person{

    private String name;
    private String gender;
    private String birthday;

    public Person() {
    }

    public Person(String name, String gender, String birthday) {
        this.name = name;
        this.gender = gender;
        this.birthday = birthday;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getBirthday() {
        return birthday;
    }

    public void setBirthday(String birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", birthday='" + birthday + '\'' +
                '}';
    }
}

public class ClassObjectDemo {

    public static void main(String[] args) throws Exception {
        //1.使用Class.forName
        Class clazz1 = Class.forName("demo.Person");
        //2.使用对象.getClass();
        Person p = new Person();
        Class clazz2 = p.getClass();
        //3.使用类名.class
        Class clazz3 = Person.class;

        System.out.println(clazz1.getName());
        System.out.println(clazz1 ==  clazz2);
        System.out.println(clazz2 ==  clazz3);
    }
}

运行结果:
demo.Person
true
true

通过上例,我们发现一个类的类对象也是单例的。