Rien de bien. La seule méthode qui vous permet de faire une chose similaire est la réflexion :
public class ReflectionExample {
private static class A {
public void foo() {
System.out.println("fooing A now");
}
}
public static void main(String[] args) throws SecurityException, NoSuchMethodException, IllegalArgumentException,
IllegalAccessException, InvocationTargetException {
Method method = A.class.getMethod("foo");
method.invoke(new A());
}
}
Et ensuite, vous ne pouvez appeler Method.invoke que sur un objet de la même classe (ou d'une sous-classe).
EDIT : Pour résoudre votre problème exact, je pense que le mieux est de créer une classe pour chaque commande. Chacune de ces classes peut implémenter une interface qui contiendra la méthode pour exécuter la commande et probablement aussi un getter String pour le nom de la commande. Vous pouvez ensuite remplir une collection avec des instances de commande.
Le seul danger de cette méthode est que vous ajoutez une nouvelle classe de commande et que vous oubliez de créer une instance de celle-ci. La meilleure méthode que j'ai trouvée pour éviter cela est d'utiliser une énumération avec un membre pour chaque commande. Pour créer les instances, vous pouvez itérer sur les valeurs de l'énumération et utiliser un switch case pour créer les instances. Certains IDE (comme Eclipse) peuvent générer un avertissement ou une erreur si une instance d'énumération n'est pas couverte par un switch - cela vous indiquera immédiatement si vous avez oublié de créer une instance de commande.