2010-05-31 3 views
3

Je voudrais pouvoir appeler une fonction basée sur son nom fourni par une chaîne. Quelque chose commeAppelez une fonction par son nom, donnée par la chaîne java

public void callByName(String funcName){ 
    this.(funcName)(); 
} 

J'ai cherché un peu dans lambda funcions mais ils ne sont pas pris en charge. Je pensais à la réflexion, mais je suis un peu novice en programmation, donc je ne suis pas très familier avec le sujet.

Toute cette question a été soulevée sur ma classe Java OOP, lorsque j'ai commencé la programmation de l'interface graphique (Swing, swt), et les événements. J'ai trouvé que l'utilisation object.addActionCommand() est très moche, parce que je devrais plus tard faire un commutateur et attraper la commande exacte que je voulais.

Je préfère faire quelque chose comme object.attachFunction(btn1_click), de sorte qu'il appellerait la fonction btn1_click lorsque le clic sur l'événement a été déclenché.

Répondre

4

Java a des méthodes, pas des fonctions. La différence est que les méthodes ont des classes; vous devez connaître la classe pour appeler la méthode. Si c'est une méthode d'instance, vous avez besoin d'une instance pour l'appeler, mais OTOH cela signifie que vous pouvez regarder la méthode facilement:

public void callByName(Object obj, String funcName) throws Exception { 
    // Ignoring any possible result 
    obj.getClass().getDeclaredMethod(funcName).invoke(obj); 
} 

Notez qu'il ya beaucoup d'exceptions possibles de cette . et les choses deviennent plus complexes si vous voulez passer des arguments dans

Si vous parlez d'une méthode de classe, ce que vous faites est légèrement différent:

public void callClassByName(Class cls, String funcName) throws Exception { 
    // Ignoring any possible result 
    cls.getDeclaredMethod(funcName).invoke(null); 
} 

vous pouvez également explorer en utilisant un java.lang.reflect.Proxy.

0

Vérifiez Class.forName() pour obtenir une définition de classe pour un nom donné.

Si vous disposez d'une interface contenant la méthode que vous souhaitez exécuter et que la classe implémente cette méthode, vous pouvez simplement créer une instance, la convertir en interface et appeler la méthode.

Si vous ne pouvez rien supposer, utilisez la réflexion sur une instance de la classe pour accéder à la méthode souhaitée et invoquez-la avec les arguments dont elle a besoin. Le tutoriel de Sun a une bonne section sur la réflexion.

1

Vous pouvez utiliser Class.getDeclaredMethod() pour obtenir la méthode avec un nom et des paramètres spécifiques, puis invoquer le retour Method objet:

Method method = MyClass.class.getDeclaredMethod("methodName", Event.class, String.class); 
Object retVal = method.invoke(someEvent, someString); 
0

Oui, API de réflexion peut être utilisé pour ce faire, mais je ne pense pas C'est la voie à suivre pour la gestion simple des événements de bouton. Mieux vaut demander comment cela peut être fait avec élégance dans le cadre GUI que vous utilisez (Swing, SWT ..), je suis sûr qu'il doit y avoir un moyen plus simple que la réflexion.

2

Le code suivant appellera une méthode publique du nom donné, sans argument:

public void callByName(String funcName) { 
    try { 
     Method method = getClass().getDeclaredMethod(funcName); 
     method.invoke(this, new Object[] {}); 
    } catch (SecurityException e) { 
     e.printStackTrace(); 
    } catch (NoSuchMethodException e) { 
     e.printStackTrace(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     e.printStackTrace(); 
    } 
} 
Questions connexes