调用指定的属性
- 通过Class实例调用getDeclaredField(String fieldName),获取运行时类指定名的属性
- setAccessible(true):确保此属性是可以访问的
- 通过Filed类的实例调用get(Object obj) (获取的操作)
或 set(Object obj,Object value) (设置的操作)进行操作。
调用私有属性
调用private String name
public void test2() throws Exception {
Class clazz = Person.class;
//创建Person实例对象
Person per = (Person) clazz.newInstance();
//1.通过Class实例调用getDeclaredField(String fieldName),获取运行时类指定名的属性
Field nameField = clazz.getDeclaredField("name");
//2. setAccessible(true):确保此属性是可以访问的
nameField.setAccessible(true);
//3. 通过Filed类的实例调用get(Object obj) (获取的操作)
// 或 set(Object obj,Object value) (设置的操作)进行操作。
nameField.set(per,"Tom");
System.out.println(nameField.get(per));
}
调用静态私有属性
public void test3() throws Exception {
Class clazz = Person.class;
//1.通过Class实例调用getDeclaredField(String fieldName),获取运行时类指定名的属性
Field infoField = clazz.getDeclaredField("info");
//2. setAccessible(true):确保此属性是可以访问的
infoField.setAccessible(true);
//3. 通过Filed类的实例调用get(Object obj) (获取的操作)或 set(Object obj,Object value) (设置的操作)进行操作。
//方式一
infoField.set(Person.class,"我是一个人");
System.out.println(infoField.get(Person.class));
// 方式二
infoField.set(null,"我是一个人"); //仅限于类变量可以如下的方式调用
System.out.println(infoField.get(null)); //仅限于类变量可以如下的方式调用
}
调用指定的方法
- 通过Class的实例调用getDeclaredMethod(String methodName,Class … args),获取指定的方法
- setAccessible(true):确保此方法是可访问的
- 通过Method实例调用invoke(Object obj,Object … objs),即为对Method对应的方法的调用。
invoke()的返回值即为Method对应的方法的返回值
特别的:如果Method对应的方法的返回值类型为void,则invoke()返回值为null
调用私有方法
public void test4() throws Exception {
Class clazz = Person.class;
Person per = (Person) clazz.newInstance();
//1.通过Class的实例调用getDeclaredMethod(String methodName,Class ... args),获取指定的方法,int.class和Integer.class的类类型不一样
Method showNationMethod = clazz.getDeclaredMethod("showNation",String.class,int.class);
//2. setAccessible(true):确保此方法是可访问的
showNationMethod.setAccessible(true);
//3.通过Method实例调用invoke(Object obj,Object ... objs),即为对Method对应的方法的调用。
//invoke()的返回值即为Method对应的方法的返回值
//特别的:如果Method对应的方法的返回值类型为void,则invoke()返回值为null
Object returnValue = showNationMethod.invoke(per,"CHN",10);
System.out.println(returnValue);
}
调用私有静态方法
public void test5() throws Exception {
Class clazz = Person.class;
//1.通过Class的实例调用getDeclaredMethod(String methodName,Class ... args),获取指定的方法
Method showInfoMethod = clazz.getDeclaredMethod("showInfo");
//2. setAccessible(true):确保此方法是可访问的
showInfoMethod.setAccessible(true);
//3.通过Method实例调用invoke(Object obj,Object ... objs),即为对Method对应的方法的调用。
//invoke()的返回值即为Method对应的方法的返回值
//特别的:如果Method对应的方法的返回值类型为void,则invoke()返回值为null
Object returnValue = showInfoMethod.invoke(null);
System.out.println(returnValue);
}
调用指定的构造器
- 通过Class的实例调用getDeclaredConstructor(Class … args),获取指定参数类型的构造器
- setAccessible(true):确保此构造器是可以访问的
- 通过Constructor实例调用newInstance(Object … objs),返回一个运行时类的实例。
调用构造器
public void test6() throws Exception {
Class clazz = Person.class;
//1.通过Class的实例调用getDeclaredConstructor(Class ... args),获取指定参数类型的构造器
//Constructor constructor = clazz.getDeclaredConstructor();
Constructor constructor = clazz.getDeclaredConstructor(String.class, int.class);
//2.setAccessible(true):确保此构造器是可以访问的
constructor.setAccessible(true);
//3.通过Constructor实例调用newInstance(Object ... objs),返回一个运行时类的实例。
//Person per = (Person) clazz.newInstance(); //jdk9之后不推荐用了
//Person per = (Person) constructor.newInstance(); //通过空参构造器,创建对象实例
Person per = (Person) constructor.newInstance("Tom", 12);
System.out.println(per);
}