反射的使用
1 操作Constructor 构造方法类
- 通过Class类对象获取对应类的Constructor构造方法类对象
Constructor[] getConstructors();
获取当前Class对象对应类中所有非私有化构造方法类对象数组。
Constructor[] getDeclaredConstructors();
【暴力反射】
获取当前Class对象对应类中的所有构造方法类对象数组,包括私有化构造方法。
Constructor getConstructor(Class... parameterTypes);
获取当前Class对象中,指定参数数据类型的构造方法。获取的构造方法为非私有化构造方法
Class... parameterTypes
Class类型不定长参数,用于约束当前构造方法对应的数据类型。
例如:
无参数构造方法
cls.getConstructor(); ==> Person();
两个参数构造方法(int, String)
cls.getConstructor(int.class, String.class) ==> Person(int, String)
Constructor getDeclaredConstructor(Class... parameterTypes);
【暴力反射】
获取当前Class对象中,指定数据类型的构造方法,包括私有化构造方法
例如:
获取私有化String类型构造方法
cls.getDeclaredConstructor(String.class) ==> private Person(String.class)
Object newInstance(Object... parameters);
通过Constructor类对象,执行对应的构造方法,创建对应类对象
Object... 不定长参数,要求数据类型为Object类型。
例如:
Person(); 无参数构造方法
Person p1 = (Person) constructor.newInstance();
Person(int, java.lang.String);
Person p2 = (Person) constructor.newInstance(10, "天地玄黄");
2 操作 Method 成员方法类
- 通过Class类对象获取对应类的Method成员方法类对象
Method[] getMethods();
通过Class类对象调用,获取当前类内的所有非私有化成员方法,包含从父类继
承而来子类可以使用的非私有化方法。
Method[] getDeclaredMethods();
【暴力反射】
通过Class类对象调用,获取当前类内的所有成员方法,包括私有化成员方法,
但是不包括从父类继承而来的方法。
Method getMethod(String methodName, Class... parameterTypes);
通过Class类对象调用,根据方法名称和对应的形式参数列表数据类型获取对应
的成员方法,可以获取父类继承方法,不能获取私有化成员方法
例如:
无参数成员方法 获取 game();
cls.getMethod("game");
有参数成员方法 获取 game(String);
cls.getMethod("game", String.class);
Method getDeclaredMethod(String methodName, Class... parameterTypes);
通过Class类对象调用,根据方法名称和对应的形式参数列表数据类型获取对应
的成员方法,可以获取私有化成员方法,不能获取父类成员方法。
例如:
无参数私有化成员方法 testPrivate();
cls.getDeclaredMethod("testPrivate");
有参数私有化成员方法 testPrivate(String);
cls.getDeclaredMethod("testPrivate", String.class);
Object invoke(Object obj, Object... parameters);
通过Method类对象调用,执行对应方法。
Object obj 执行当前方法的类对象。
Object... parameters 对应当前方法的实际参数列表
3 操作 Field 成员变量类
- 通过Class类对象获取对应类的Field成员变量类对象
Field[] getFields();
获取类内所有非私有化成员变量数组
Field[] getDeclaredFields();
【暴力反射】
获取类内所有成员变量数组,包括私有化成员变量
Field getField(String fieldName);
根据成员变量名字获取对应的成员变量对象,要求当前成员变量非私有化
例如:
public int test;
cls.getField("test");
Field getDeclaredField(String fieldName);
【暴力反射】
获取类内指定名字的成员变量对象,包括私有化成员变量
例如:
private String name;
private int id;
cls.getDeclaredField("name");
cls.getDeclaredField("id");
void set(Object obj, Object value);
赋值Field类对象对应成员变量
Object obj 明确当前赋值的成员变量是哪一个类对象的。
Object value 给予当前成员变量赋值使用数据
Before:
Person p = new Person();
p.setName("张三");
Now:
name.set(p, "张三");
Object get(Object obj);
取值Field类对象对应成员变量
Object obj 明确获取的成员变量对应数据是哪一个类对象
Before
Person p = new Person();
p.getName(); ==> 张三
name.get(p); ==> 张三
4 暴力反射授权
class AccessibleObject 类内方法
public static void setAccessible(AccessibleObject[] array, boolean flag);
通过类名调用的静态工具方式,给予AccessibleObject类对象或者其子类对象数
组,赋值操作权限。
子类对象包括: Field Method Constructor
public void setAccessible(boolean flag);
通过AccessibleObject类对象调用,单一权限授权,Field Method Constructor都可以使用。