5. 反射
5.1 概述
反射机制:在程序运行过程中,对于任何一个类都能获取到它的属性和方法,并且对于任何一个对象都能调用它的任意一个方法,这种动态的获取信息以及动态的调用对象方法的功能就称为反射机制。
5.2 获取Class对象的三种方式
首先看看Java代码在计算机中经历的三个阶段:
由上可知:获取Class对象的三种方式分别对应Java代码在计算机中的三个阶段
5.2.1 Class.forName(“全类名”)
将字节码文件加载进内存,返回Class对象;多用于配置文件,将类名定义在配置文件中。读取文件,加载类
5.2.2 类.Class
通过类名的属性class获取,多用于参数的传递
5.2.3 对象.getClass()
getClass()方法在Object类中定义着。 多用于对象的获取字节码的方式
public static void main(String[] args) throws Exception {
//1.Class.forName("全限定类名")
Class<?> cls1 = Class.forName("reflect.bean.Person");
System.out.println(cls1);
//2.类.Class
Class<Person> cls2 = Person.class;
System.out.println(cls2);
//3.对象.getClass()
Person person = new Person();
Class<? extends Person> cls3 = person.getClass();
System.out.println(cls3);
System.out.println(cls1 == cls2);
System.out.println(cls1 == cls3);
}
运行结果:
class reflect.bean.Person
class reflect.bean.Person
class reflect.bean.Person
true
true
结论:同一个字节码文件(*.class)在一次程序运行过程中,只会被加载一次,不论通过哪一种方式获取的Class对象都是同一个。
5.2 常见的反射API
类 | 概述 |
---|---|
Class | 反射的核心类,可以获取类的属性,方法等信息 |
Field | 表示类的成员变量,可以用来获取和设置类之中的属性值 |