2012-06-27 18 views
9

是否有可能以某種方式迭代對象的每個方法,名稱以「get」開頭?我想比較兩個非常複雜的自定義對象,它們具有基於其他自定義對象的數據結構組成的字段。我想要做的是得到每個get方法結果的散列碼,並比較每個字段的結果是否相等。迭代名稱以「get」開頭的所有方法 - 比較對象

對不起,如果不是很理解,如果你有問題,請提問。感謝您的幫助和建議

我想到了這樣的事情:

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

所以你想要做的事一樣得到***( )..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 Object r = m.invoke(o); – LucasSeveryn

+0

它在實例'o'上調用方法'm'並將結果賦給'r'。在'm.getName()'返回'getXyz'的情況下,它相當於'Object r = o.getXyz()'。 –

+0

非常感謝Marko!非常有用和清晰的解決方案 – LucasSeveryn

0

看起來有些東西對付反射概念。逆向工程對象

可能這就是你需要

樣品等級:

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

主要方法:

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 
} 

}