反射
反射是动态语言的关键, 允许程序在执行期间获取任何类的内部信息, 并直接操作任意对象的内部属性和方法
加载完某个类后, 在堆内存的方法区中产生了一个Class类型的对象—每个类对应一个且只有唯一一个Class对象. 这个对象包含类的完整的结构信息
Java反射机制提供的功能
- 在运行时判断任意一个对象所属的类
- 在运行时构造任意一个类的对象
- 在运行时判断任意一个类所具有的成员变量和方法
- 在运行时获取泛型信息
- 在运行时调用任意一个对象的成员变量和方法
- 在运行时处理注解
- 生成动态代理
反射相关主要API
java.lang.Class: 含义是类的抽象, 不妨称为通用类, 所有的类都是该类的对象, 有些存储元数据的感觉java.lang.reflect.Method: 类的方法java.lang.reflect.Field: 类的成员变量java.lang.reflect.Constructor: 类的构造器
java.lang.Class类的理解
- 程序经过
javac.exe命令编译后, 会生成多个字节码文件.class - 当使用
java.exe执行字节码文件时, 加载到内存中的类便称为运行时类, 此运行时类就是Class类的一个对象
注意: Class类的对象不是new出来的, 而是运行时类便对应Class类的一个对象
获取运行时类的对象的方法
加载到内存中的运行时类会缓存一定的时间, 在这段时间内获取到的都是同一个运行时类的对象
最常使用的是第三种方式, 因为将类作为参数传入, 没有写死代码, 更加灵活
// 获取运行时类的方法一: 通过类名.class直接获取
Class<Person> personClass1 = Person.class;
System.out.println(personClass1);
// 方法二: 通过运行时类的对象获取
Person person = new Person();
Class<? extends Person> personClass2 = person.getClass();
System.out.println(personClass2);
// 方法三: 调用Class的静态方法forName(), 传入类的全类名, 从蓝色的java路径开始写
Class<?> personClass3 = Class.forName("java高级编程.反射.Person");
System.out.println(personClass3);
反射中的常用方法
| 方法 | 作用 |
|---|---|
getFields() |
获取当前运行时类及其父类中所有的public的方法 |
getDeclaredFields() |
获取当前运行时类中所有的方法, 包括private |
getModifiers() |
获取权限修饰符 |
getType() |
获取类型 |
getName() |
获取变量名 |