2012-06-27 13 views
9

E 'possibile in qualche modo iterare su ogni metodo di un oggetto, con il nome che inizia con "get"? Voglio confrontare due oggetti personalizzati molto complessi, che hanno campi costituiti da strutture dati basate su altri oggetti personalizzati. Quello che voglio fare è ottenere un codice hash del risultato di ogni metodo get e confrontare se sono uguali per ogni campo.Iterating su tutti i metodi che hanno il nome che inizia con "get" - confronto degli oggetti

Scusate se non è molto comprensibile, se avete domande si prega di chiedere. Grazie per qualsiasi aiuto e suggerimenti

ho pensato a qualcosa di simile:

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

Così si vuole fare qualcosa di simile ottenere *** () ..write? .. – Ahmad

+1

... Stai cercando di costruire un'implementazione riflessiva di 'hashCode()' o 'equals'? C'è un motivo per cui non puoi semplicemente farli generare da 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

risposta

15

Certamente è possibile, ed in effetti molto semplice:

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

Ciao, vorresti spiegare cosa fa questa linea: final Object r = m.invoke (o); – LucasSeveryn

+0

Invoca il metodo 'm' su instance' o' e assegna il risultato a 'r'. Fa l'equivalente di 'Object r = o.getXyz()', nel caso in cui 'm.getName()' restituisca 'getXyz'. –

+0

Grazie mille Marko! Soluzione molto utile e chiara! – LucasSeveryn

0

Sembra che qualche cosa a che fare con il concetto di reflex . Reverse engineering l'oggetto

Può essere questo è quello che ti serve

classe di esempio:

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

Metodo principale:

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 
} 

} 
Problemi correlati