2011-02-04 4 views
7

J'ai une méthode statique intitulée chooseDialog (chaîne s, int i) dans laquelle je veux appeler une autre méthode dans la même classe (Dialogs.class) en fonction des paramètres fournis à chooseDialog. s est le nom de la méthode désirée et i est son seul paramètre.Android/Java: Appeler une méthode en utilisant la réflexion?

J'ai essayé de nombreux tutoriels et j'ai passé quelques heures à lire sur le sujet, mais je n'arrive pas à me faire une idée précise de ce que je dois faire.

Des idées?

Merci! Pourquoi voulez-vous appeler une méthode dont le nom est passé dans un paramètre String?

+0

Avez-vous vraiment besoin de réflexion? – dacwe

+1

Bien qu'il puisse y avoir une bonne solution à votre problème, il peut être préférable de poster le vrai problème que vous essayez de résoudre. Par exemple. pourquoi voulez-vous faire ce genre de sélection de méthode? Très souvent, quelqu'un peut trouver un modèle de conception de POO qui résout le problème sous-jacent au lieu de trouver une solution par-force à la question spécifique. Par exemple, le modèle d'usine peut être ce dont vous avez besoin, ce qui vous permet de sélectionner des classes, qui fournissent ensuite la fonction requise en tant qu'implémentations d'un message abstrait. Ne laissez pas les détails de votre problème vous permettre de perdre de vue l'image plus grande. – Ber

+0

Chaque méthode de cette classe (autre que chooseDialog) représente une série d'actions uniques (10+ chacune) et cette classe particulière comprend plus de 300 méthodes parmi lesquelles choisir. Cela semblait être la meilleure route pour moi. Suis-je incorrect? Y a-t-il une meilleure option? – Jared

Répondre

13

Pourquoi? Vous ne pouvez pas créer de constantes pour différentes actions, puis utiliser switch et dans chaque cas appeler la méthode avec le paramètre i?

Vous aurez l'avantage de compiler en vérifiant votre code pour les erreurs.

modifier: si vous voulez vraiment utiliser la réflexion, récupérer un objet Method avec:

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

Je suppose que Integer.class pourrait fonctionner. Puis invoquer la metod comme

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

Chaque méthode de cette classe (autre que chooseDialog) représente une série d'actions uniques (10+ chacune) et cette classe particulière comprend plus de 300 méthodes parmi lesquelles choisir. Cela semblait être la meilleure route pour moi. Suis-je incorrect? Y a-t-il une meilleure option? – Jared

+1

Si vous avez affaire à ce grand nombre de méthodes, c'est probablement pour le mieux. Mais moi-même, j'aurais peur des fautes de frappe. – Axarydax

+0

Vous n'avez pas besoin d'envelopper les paramètres de classe dans un tableau; vous pouvez simplement les fournir comme une liste d'arguments. Par exemple: 'YourClass.class.getMethod (" nom_méthode ", Integer.class, String.class)'. –

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

Si vous voulez juste appeler une autre méthode statique de la classe, vous pouvez utiliser l'approche déjà identifiés par d'autres:

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

Mais si vous voulez Pour pouvoir utiliser une méthode statique pour appeler une méthode non statique, vous devrez passer l'objet que vous souhaitez référencer ou rendre chooseDialog non-static.

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

Mais je ne pense pas que ce soit la bonne façon de gérer la POO. Et sur la base de vos commentaires, la réflexion n'est pas absolument nécessaire, et choisirDialog analyser la chaîne et passer à la méthode appropriée est une approche beaucoup plus sûre. Dans les deux cas, vos tests unitaires devraient se ressembler.

if (s.equals("dialog1")) { 
     dialog1(i); 
    } 
Questions connexes