2010-06-11 4 views

Répondre

15

Puisque les méthodes ne sont pas eux-mêmes des objets, ils n'ont pas propriétés directes (comme vous attendez avec des fonctions de première classe dans des langages comme JavaScript).

Le plus proche que vous pouvez faire est d'appeler Car.class.getMethods()

Car.class est un objet Class que vous pouvez utiliser pour appeler l'une des méthodes de réflexion.

Cependant, pour autant que je sache, une méthode n'est pas capable de s'identifier.

1

essayer,

import java.lang.reflect.*; 
    public class DumpMethods { 
     public static void main(String args[]) { 
      try { 
       Class c = Class.forName(args[0]); 
       Method m[] = c.getDeclaredMethods(); 
       for (int i = 0; i < m.length; i++) 
        System.out.println(m[i].toString()); 
      } catch (Throwable e) { 
       System.err.println(e); 
      } 
     } 
    } 
32

Vous pouvez obtenir la chaîne comme ceci:

Car.class.getDeclaredMethods()[0].getName(); 

Ceci est le cas d'une seule méthode dans votre classe. Si vous voulez parcourir toutes les méthodes déclarées, vous devrez parcourir le tableau retourné par Car.class.getDeclaredMethods():

for (Method method : Car.class.getDeclaredMethods()) { 
    String name = method.getName(); 
} 

Vous devez utiliser getDeclaredMethods() si vous voulez voir tous, getMethods() ne retourneront que dans publique méthodes.

Et enfin, si vous voulez voir le nom de la méthode, qui est en cours d'exécution au moment, vous devez utiliser ce code:

Thread.currentThread().getStackTrace()[1].getMethodName(); 

Cela obtenir une trace de pile pour le thread courant et retour le nom de la méthode en haut.

+0

Merci, je crains que je ne veux pas vraiment être lié à la « une méthode par classe » chose ... Vous pouvez – drozzy

+0

obtenir toutes les méthodes de la classe ou tout simplement méthode en cours d'exécution en ce moment. Voir mes modifications. :) – Malcolm

+0

Merci. Curieuse. Mais j'ai besoin du nom d'une méthode qui n'est pas en cours d'exécution. Il semble que Java ne fournit pas un moyen de le faire ... – drozzy

-1

Attendez, puisque vous connaissez déjà le nom de la méthode, ne pouvez-vous pas le taper comme une chaîne?

au lieu de (pseudo) Class.methodName.toString(), il suffit d'utiliser "methodName ».

Sinon, vous pouvez utiliser Class#getDeclaredMethods() pour obtenir toutes les méthodes dans une classe

+7

Je ne veux pas utiliser une chaîne. Je peux refactoriser mon nom de méthode dans le futur. – drozzy

+1

Les IDE ont la possibilité de regarder dans les chaînes lors de la refactorisation – Bozho

13

Alors, vous voulez obtenir le nom de la méthode en cours d'exécution ? Voici une façon assez laide à faire:

Exception e = new Exception(); 
e.fillInStackTrace(); 
String methodName = e.getStackTrace()[0].getMethodName(); 
+0

En fait, this.getClass(). GetEnclosingMethod() fonctionne très bien! – momomo

+0

momomo, non, ce n'est pas le cas. class Test { @Test public void testReflection() { assert (this.getClass(). GetEnclosingMethod() == null); } } –

Questions connexes