2012-03-19 15 views
2

在下面的測試用例中,直接字段t不被CGLIB攔截。 那麼我可以使用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(); 
    } 
} 
} 

回答

0

不,那是不可能的。字段訪問不會委派給定義字段的類的某些字節代碼。它是由使用該字段的方法直接加載的。 (在你的情況下,這是Test#testCGLib。)

cglib創建一個子類並攔截方法調用。字段可以不被覆蓋,它們不是多態的,有或沒有cglib。因此,你永遠不能攔截現場訪問。您只能隱藏子類中的字段。

但即使您在工具類中隱藏了字段A#t:由於cglib類在編譯時不可見,因此無法通過檢測類型引用該字段。如果儀表類A$$cglib過場t,你可以通過

a.getClass().getField("x").get(a) 

爲了模仿某種充滿活力的領域結合的唯一訪問它。 (基本上,這些方法是動態綁定的,會導致動態選擇字段。

相關問題