在下面的测试用例中,直接字段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();
}
}
}
不,那是不可能的。字段访问不会委托给定义该字段的类的某些字节代码。它由使用该字段的方法直接加载。 (在你的情况下,这是Test#testCGLib
.)
cglib 创建一个子类并拦截方法调用。然而,字段不能被覆盖,它们不是多态的,无论有没有 cglib。因此,您永远无法拦截字段访问。您只能隐藏子类中的字段。
但即使你隐藏了这个字段A#t
在插装类中:由于 cglib 类在编译时不可见,因此无法通过插装类型引用该字段。如果仪器类A$$cglib
有一块田地t
你只能通过以下方式访问它
a.getClass().getField("x").get(a)
为了模拟某种动态字段绑定。 (基本上,这些方法是动态绑定的,这将导致right动态选择字段。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)