1024

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;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读