2011-02-04 13 views
7

Ho un metodo statico intitolato chooseDialog (String s, int i) in cui voglio chiamare un altro metodo all'interno della stessa classe (Dialogs.class) in base ai parametri forniti per chooseDialog. s è il nome del metodo desiderato e io è il suo parametro singolo.Android/Java: la chiamata di un metodo mediante la riflessione?

Ho provato numerosi tutorial e ho trascorso alcune ore a leggere sull'argomento, ma non riesco a capire con precisione cosa esattamente devo fare.

Qualche idea?

Grazie!

+0

Hai davvero bisogno di una riflessione? – dacwe

+1

Anche se potrebbe esserci una buona soluzione per il tuo problema, potrebbe essere meglio postare il vero problema che stai cercando di risolvere. Per esempio. perché vuoi fare questo tipo di selezione del metodo? Molto spesso qualcuno può trovare un modello di progettazione OOP che risolva il problema di fondo invece di trovare una soluzione par-force alla domanda specifica. Ad esempio, lo schema di fabbrica può essere quello che ti serve, permettendoti di selezionare le classi, che quindi forniscono la funzione richiesta come implementazione di un messaggio astratto. Non lasciare che i dettagli del tuo problema ti permettano di perdere di vista l'immagine più grande. – Ber

+0

Ogni metodo in questa classe (diverso da chooseDialog) rappresenta una serie di azioni univoche, (10+ ciascuna) e questa particolare classe comprende oltre 300 metodi tra cui scegliere. Questo sembrava essere il modo migliore per me di andare. Sono errato? C'è un'opzione migliore? – Jared

risposta

13

Perché si desidera chiamare un metodo con nome passato in un parametro String? Non è possibile creare costanti per diverse azioni, quindi utilizzare switch e in ogni caso chiamare il metodo con il parametro i?

Avrete il vantaggio del compilatore di controllare il vostro codice per gli errori.

modificare: se davvero si vuole utilizzare la riflessione, recuperare un oggetto Method con:

Method m = YourClass.class.getMethod("method_name",new Class[] { Integer.class }) 

Credo Integer.class potrebbe funzionare. Quindi richiamare il metodo descritto come

m.invoke(null,123); //first argument is the object to invoke on, ignored if static method 
+0

Ogni metodo in questa classe (diverso da chooseDialog) rappresenta una serie di azioni univoche, (10+ ciascuna) e questa particolare classe comprende oltre 300 metodi tra cui scegliere. Questo sembrava essere il modo migliore per me di andare. Sono errato? C'è un'opzione migliore? – Jared

+1

Se hai a che fare con questo enorme numero di metodi, è probabilmente il meglio. Ma io stesso avrei paura degli errori di battitura. – Axarydax

+0

Non è necessario racchiudere i parametri della classe in una matrice; puoi semplicemente fornirli come una lista di argomenti. Ad esempio: 'YourClass.class.getMethod (" method_name ", Integer.class, String.class)'. –

2
Method method = Dialogs.getMethod(s, Integer.class); 
method.invoke(null, i); 
1

Se si desidera solo per chiamare un altro metodo statico della classe, quindi è possibile utilizzare il metodo già individuato da altri:

Method method = Dialogs.getMethod(s, Integer.class); 
method.invoke(null, i); 

Ma se si vuole per poter utilizzare un metodo statico per chiamare un metodo non statico, è necessario passare l'oggetto a cui si desidera fare riferimento o effettuare chooseDialog non statico.

function chooseDialog(Object o, String s, Integer i) { 
    Method method = Dialogs.getMethod(o, Integer.class); 
    method.invoke(o, i); 
} 

Ma non penso che questo sia il modo OOP corretto per gestire il problema. E in base ai tuoi commenti, la riflessione non è assolutamente necessaria, e hai sceltoDialog analizzare la stringa e passare al metodo appropriato è un approccio molto più tipicamente sicuro. In entrambi gli approcci, i test di unità dovrebbero essere uguali.

if (s.equals("dialog1")) { 
     dialog1(i); 
    } 
Problemi correlati