Java创建反射的三种方式:
<1> .class 通过类名.class 的方式:
Class clazz = BaseClass.class
<2> .getClass 通过类对象.getClass 的方式:
BaseClass bc = new BaseClass();
Class clazz = bc.getClass();
<3> .forName 通过Class.forName(...)
Class clazz = Class.forName(包名.类名)
基类:
public class BaseClass {
//私有属性
private String user;
private String name;
//私有方法
private void privateMethod(){
System.out.println("私有方法调用成功!");
}
//省略get 和set
}
测试类:
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class PrivateTest {
public static void main(String[]args){
BaseClass bc = new BaseClass();
//私有属性的访问权限
try {
//每一个Field 对象对应一个私有属性,当然也可以用for循环遍历来统一设置私有属性的访问权限
Field user = bc.getClass().getDeclaredField("user");
Field name = bc.getClass().getDeclaredField("name");
user.setAccessible(true); // 获取user访问权限
name.setAccessible(true);// 获取name访问权限
//给user 和 name 赋值
user.set(bc,"ok");
name.set(bc,"hh");
System.out.println(user.get(bc));
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
//获取私有方法的访问权限
try {
Method privateMethod = bc.getClass().getDeclaredMethod("privateMethod");
privateMethod.setAccessible(true);
privateMethod.invoke(bc);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}