JAVA 暴力反射私有类中类并获取字段值
2022-01-28 本文已影响0人
圆梦人生
场景是:运行类中需要反射另外一个类中私有类,并获取私有类中字段值
案例
Test.main
package cn.sunmeng;
import java.lang.reflect.Field;
/**
* 暴力反射类中类,拿到类种类中对应字段的值
* @author SM
*/
public class Test {
// 测试方法
public static void main(String[] args) throws Exception {
// 假设外部test3 已经给予了值
Test2 test2 = new Test2();
// 开始暴力反射操作
Test t = new Test();
t.violentReflex(test2);
}
// 暴力反射 test2 拿到test3中的值
public void violentReflex(Test2 test2) throws Exception{
// 拿到Test2实例
Class<Test2> clazz = (Class<Test2>) test2.getClass();
//
System.out.println("tese2 clazz === "+ clazz);
// 暴力反射test2拿到test3
Field field = clazz.getDeclaredField("test3");
//暴力反射
field.setAccessible(true);
//
System.out.println("field test3 === " + field);
// 反射后拿到Test3类
Test3 obj = (Test3)field.get(test2);
// 输出类中结果
System.out.println("t3 id === "+ obj.getId() );
System.out.println("t3 name === "+ obj.getName());
}
}
Test2.main
package cn.sunmeng;
/**
* est2里面有私有Test3
* @author SM
*/
public class Test2 {
// 私有 Test3
private final Test3 test3;
// 构造中把 Test 赋值
Test2(){
test3 = new Test3();
test3.setId("SM Test3 ID value");
test3.setName("SM Test3 Name value");
}
}
Test3.main
package cn.sunmeng;
/**
* Test3
* @author SM
*
*/
public final class Test3 {
//
Test3(){}
private String id;
private String name;
// get 和 set
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}