Java反射
1. 定义
Java放射机制是在运行状态中,对于任意一个类,都能知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意方法和属性。
2. 反射机制的相关类
与Java反射相关的类如下:
| 类名 |
用途 |
| Class类 |
代表类的实体,在运行的Java应用程序中表示类和接口 |
| Field类 |
代表类的成员变量(成员变量也称为类的属性) |
| Method类 |
代表类的方法 |
| Constructor类 |
代表类的构造方法 |
2.1 Class类
Class代表类的实例,在运行的Java应用程序中表示类和接口。在这个类中提供了很多有用的方法:
| 方法 |
用途 |
| asSubclass(Class clazz) |
把传递的类的对象转换成代表子类的对象 |
| Cast |
把对象转换成代表类或是接口的对象 |
| getClassLoader() |
获得类的加载器 |
| getClasses() |
返回一个数组,数组中包含该类中所有公共类和接口类的对象 |
| GetDeclaredClasses() |
返回一个数组,数组中包含该类中所有类和接口类的对象 |
| forName(String className) |
根据类名返回类的对象 |
| getName() |
获得类的完整路劲名字 |
| newInstance() |
创建类的实例 |
| getPackage() |
获得类的包 |
| getSimpleName() |
获得类的名字 |
| getSuperclass() |
获得当前类继承的父类的名字 |
| getInterfaces() |
获得当前类实现的类或是接口 |
| 方法 |
用途 |
| getField(String name) |
获得某个公有的属性对象 |
| getFields() |
获得所有公有的属性对象 |
| getDeclaredField(String name) |
获得某个属性对象 |
| getDeclaredField() |
获得所有属性对象 |
![获得类中注解相关的方法]()
| 方法 |
用途 |
| getConstructor(Class...<?> parameterTypes) |
获得该类中与参数类型匹配的公有构造方法 |
| getConstructors() |
获得该类的所有公有构造方法 |
| getDeclaredConstructor(Class...<?> parameterTypes) |
获得该类中与参数类型匹配的构造方法 |
| getDeclaredConstructors() |
获得该类所有构造方法 |
| 方法 |
用途 |
| getMethod(String name, Class...<?> parameterTypes) |
获得该类某个公有的方法 |
| getMethods() |
获得该类所有公有的方法 |
| getDeclaredMethod(String name, Class...<?> parameterTypes) |
获得该类某个方法 |
| getDeclaredMethods() |
获得该类所有方法 |
![类中其他重要的方法]()
2.2 Field类
Field代表类的成员变量(成员变量也称为类的属性)
| 方法 |
用途 |
| equals(Object obj) |
属性与obj相等则返回true |
| get(Object obj) |
获得obj中对应的属性值 |
| set(Object obj, Object value) |
设置obj中对应属性值 |
2.3 Method类
method代表类的方法
| 方法 |
用途 |
| invoke(Object obj, Object... args) |
传递object对象及参数调用该方法对应的方法 |
2.4 Constructor类
Constructor代表类的构造方法
| 方法 |
用途 |
| newInstance(Object... initargs) |
根据代替的参数创建类的对象 |
2.4 四个类的关系
![image-20201125183827394]()
- 字节码中有多个字段、方法、构造器,是用数组存储的。
- 数组里的每一个元素,都是对应的对象。
- Field、Method、Constructor对象内部有对字段、方法、构造器更详细的描述。
3. 反射的使用
3.1 创建Class对象
- 创建Class对象的方式一:(对象.getClass()),获取类中的字节码文件。
Class clazz = p1.getClass()
- 创建Class对象的方式二:(类.class),需要输入一个明确的类,任意一个类都有一个静态的class属性。
Class clazz = Person.class;
- 创建Class对象的方式三:(forName("String className"))。
Clazz = Class.forName("Person");
3.2 根据反射创建对象实例
- 通过类对象的newInstance方法。
Object o1 = p1.newInstance();
- 通过构造器的newInstance方法。
3.3 根据反射调用方法
invoke(Object obj, Object... args)