2012-06-27 5 views
9

"get"で始まる名前のオブジェクトのすべてのメソッドを何とか反復することはできますか?私は、他のカスタムオブジェクトに基づくデータ構造からなるフィールドを持つ2つの非常に複雑なカスタムオブジェクトを比較したいと思います。私がしたいのは、すべてのgetメソッドの結果のハッシュコードを取得し、それらがすべてのフィールドで等しいかどうかを比較することです。"get"で始まるすべてのメソッドの反復 - オブジェクトの比較

申し訳ありませんご不明な点がございましたら、ご不明な点がありましたらお尋ねください。任意のヘルプや提案

ためのおかげで、私はそのようなことを考えた:

for(method m : gettersOfMyClass){ 
boolean same = object1.m.hashCode() == object2.m.hashCode() 
} 
+0

はそうあなたが得るような何かをしたい:

class Syndrome{ public void getMethod1(){} public void getMethod2(){} public void getMethod3(){} public void getMethod4(){} } 

主な方法:これはあなたが

サンプルクラスを必要とするものであるかもしれませオブジェクト

をリバースエンジニアリング).. write?.. – Ahmad

+1

... 'hashCode()'または 'equals'の反射実装を構築しようとしていますか?あなたのIDEにそれらを生成させるだけの理由がありますか? –

+0

getters - http://stackoverflow.com/questions/8524011/java-reflection-how-can-i-get-the-all-getter-methods-of-a-java-class-and-invoke – ant

答えて

15

確かにそれは可能だし、実際には非常に簡単:

public static void main(String[] args) throws Exception { 
    final Object o = ""; 
    for (Method m : o.getClass().getMethods()) 
    if (m.getName().startsWith("get") && m.getParameterTypes().length == 0) { 
     final Object r = m.invoke(o); 
     // do your thing with r 
    } 
} 
+0

こんにちは、この行が何をしているのか気になりますか? finalオブジェクトr = m.invoke(o); – LucasSeveryn

+0

インスタンス 'o'に対してメソッドmを呼び出し、その結果を 'r'に代入します。 'm.getName()'が 'getXyz'を返す場合、' Object r = o.getXyz() 'と同等です。 –

+0

ありがとうMarko!非常に便利でクリアなソリューション! – LucasSeveryn

0

は反射的概念に対処するためにいくつかのことのように見えます。 (***

Syndrome syndrome = new Syndrome(); 

Method[] methods = syndrome.getClass().getMethods(); 

for(int index =0; index < methods.length; index++){ 

if(methods[index].getName().contains("get")){ 
    // Do something here 
} 

} 
関連する問題