2016-11-18 5 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を作成しますか?

NOTE

Aクラスには公共のゲッターとセッターがありません。

なぜ私はこれをしたいですか?

私は、コピーして直面し、equalshashCodeメソッドのテストを貼り付けるので、あなたが持っていないので、私はPOJOのメソッドのテストフレームワークpojo-tester を書くことにしたそれは、オブジェクトの平等、ハッシュコード、ゲッター、セッター、のtoStringおよびコンストラクタをテストしました。手でテストを書く。

問題は、このライブラリがnewInstance()メソッドによってオブジェクト(クラスの新しいインスタンス)を作成することです。その後、私はそれらを同じにしたい - ベースオブジェクトからのフィールドのすべての値は、新しく作成されたオブジェクトに設定する必要があります。

equalsメソッド実装がsuper.equals(...)に依存し、スーパークラスのフィールドに(UUIDのような)ランダムな値がある場合、または公開されていない場合に問題があります。

これを達成する方法はありますか?多分他のライブラリですか?

ところで

誰かがこれを行うと、貢献したい、ちょうどPRを送信する方法を知っていれば! :)

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-リフレクションの影響を受ける可能性がある?rq = 1 – Rob

+0

そして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

関連する問題