2016-11-18 68 views
0

鑑於類中聲明場的變化值:Java反射,在超

public class A { 
    private UUID uuid; 

    public A(){ 
     uuid = UUID.randomUUID(); 
    } 
    // equals 
} 

class B extends A { 
    private int b; 
    // getters, setters, equals (invokes super.equals(...)) 
} 

class Sample { 

    public static void main(String[] args){ 
    B b1 = new B(); // 
    B b2 = B.class.newInstance(); 

    // now I want to take value of A.uuid from b1 and set it to b2 
    } 
} 

問題

我不知道如何從B1實例得到uuid領域的價值,並將其設置到b2。 A類中的私有字段無法被B.class.getDeclaredFields()和類似的方法訪問... java編譯器是否創建了任何合成訪問器或者像這樣的smth?

注意

有沒有公共getter和setter在A類。

爲什麼我想這樣做?

我面臨着複製和粘貼equalshashCode方法測試,所以我決定寫POJO方法測試框架pojo-tester 它測試對象平等,哈希碼,干將,制定者,的toString和構造,所以你不必用手寫測試。

問題是,該庫通過newInstance()方法創建對象(類的新實例)。之後,我想讓它們相等 - 來自基礎對象的所有字段值都應該在新創建的對象中設置。

正如您可以猜到,有問題的時候equals方法的實現依賴於super.equals(...)和超類領域具有隨機值(如UUID)或不公開。

有什麼辦法可以達到這個目的嗎?也許還有其他圖書館?

BTW

如果有人知道如何做到這一點,並且願意發揮,只是給公關! :)

https://github.com/sta-szek/pojo-tester

感謝

+1

見http://stackoverflow.com/questions/7966466/getting-first-parents-fields-via-reflection?rq=1 – Rob

+0

而http://stackoverflow.com/questions/10638826/java- reflection-impact-of-setaccessibletrue?rq = 1 – Rob

+0

and http://stackoverflow.com/questions/1196192/how-do-i-read-a-private-field-in-java?rq=1 – Rob

回答

0

使用本。

Field[] fs = b.getClass().getSupperClass().getDeclaredFields(); 
for(Field f: fs) 
{ 
    if(f.getName().equals("uuid")) 
    { 
     f.setAccessible(true); 
     return f.get(new UUID()); 
     } 
} 
+0

不應該'f.get(new UUID());'是'f.get(b );'?但是,我認爲缺少的鏈接是'setAccessible(true)' – RobCo