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)