概念
反射允许对成员变量,成员方法和构造方法的信息进行编程访问。
通过字节码文件可以获取这个类的成员变量,构造方法和成员方法,以及他们各自的修饰符,名称,数据类型,形参,返回值,抛出的异常等。
在所有操作之前,首选需要获取Class对象
获取Class对象
有三种方式
- Class.forName(“全类名”);
- 类名.class
- 对象.getClass();
package com.test
public class Test{
public static void main(String[] args){
//方式一,使用Class.forName("全类名")
Class user1 = Class.forName("com.test.User");
//方式二,使用类名.class
Class user2 = User.class;
//方式三,使用对象获取
User user = new User();
Class user3 = user.getClass();
}
}
class User{}
注:最常用的是第一种方式
获取Class对象之后就可以获取其他的内容
获取构造方法
方法 | 描述 |
---|---|
Constructor<?>[]getConstructors() | 返回公共构造方法对象的数组 |
Constructor<?>[] getDeclaredConstructors() | 返回所有构造方法对象的数组 |
Constructor getConstructor(Class<?>… parameterTypes) | 返回单个公共构造方法对象 |
Constructor getDeclaredConstructor(Class<?>… parameterTypes) | 返回单个构造方法对象 |
注:小括号里写想要获取构造方法的形参变量,例如
String.class
,int.class
- 获取其访问修饰符只需要调用
getModifiers();
,返回值是int
类型,public是1,private是2
- 获取构造方法的形参的数组,
Parameter[] getParameters();
- 使用获取的Class对象创建对象Object<> newInstance(参数),里面的参数要与构造方法中的参数保持一致
暴力反射:若获取的构造方法对象是私有的,则可以使用
void setAccessible(true);临时取消权限验证,这样在外部也可以直接访问该方法。
获取成员变量
方法 | 描述 |
---|---|
Field[] getFields() | 获取所有公开的成员变量数组 |
Field[] getDeclaredFields() | 获取所有的变量对象的数组 |
Field getField(String name) | 返回单个公共成员变量对象 |
Field getDeclaredField(String name) | 返回单个成员变量对象 |
获取成员变量对象后可以获取其:修饰符,变量名,数据类型,成员变量记录的值并且可以修改其记录的值
- int getModifiers();
- String getName();
- Class<?> getType();
- Object get(要获取的值所在的对象);
- void set(要修改的值所在的对象,值)
获取成员方法
方法 | 描述 |
---|---|
Method[] getMethods() | 返回所有公共成员方法对象,包括继承的 |
Method[] getDeclaredMethods() | 返回所有成员方法对象,不包括继承的 |
Method getMethod(String name, Class<?>… parameterTypes) | 返回单个公共成员方法对象 |
Method getDeclaredMethod(String name, Class<?>… parameterTypes) | 返回单个成员方法对象 |
注:小括号中第一个是方法名,第二个是方法的形参列表
获取方法的形参列表
Parameter[] getParameters();
获取方法抛出的异常
Class[] getExceptionTypes();
运行获取出的方法
Class<> invoke(方法调用者,实参)