gpt4 book ai didi

java - 可以用cglib拦截direct field吗?

转载 作者:行者123 更新时间:2023-11-29 09:15:30 27 4
gpt4 key购买 nike

在下面的测试用例中,直接字段t没有被CGLIB拦截。那么我可以使用 CGLIB 吗?

public class Test {

@Test
public void testCGLib() {
A a = (A) Enhancer.create(A.class, new Class[] {}, new B());
System.out.println(a.t);
a.t();
}

public static class A {

public int t = 0;

public void t() {
System.out.println("bbb");
}

}

public static class B implements LazyLoader {

@Override
public Object loadObject() throws Exception {
System.out.println("xxx");
return new A();
}
}
}

最佳答案

不,那是不可能的。字段访问未委托(delegate)给定义字段的类的某些字节代码。它由使用该字段的方法直接加载。 (在您的例子中,这是 Test#testCGLib。)

cglib 创建子类并拦截方法调用。然而,字段不能被覆盖,它们不是多态的,有或没有 cglib。因此,您永远无法拦截字段访问。您只能隐藏子类中的字段。

但即使您在检测类中隐藏字段 A#t:由于 cglib 类在编译时不可见,您不能通过检测类型引用该字段。如果检测类 A$$cglib 有一个字段 t 你只能通过

访问它
a.getClass().getField("x").get(a)

为了模拟某种动态字段绑定(bind)。 (基本上,这些方法是动态绑定(bind)的,这将导致动态选择正确的字段。

关于java - 可以用cglib拦截direct field吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9767111/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com