2010-06-11 8 views

Respuesta

15

Dado que los métodos no son objetos en sí, que no tienen propiedades directas (como se esperaría con funciones de primera clase en idiomas como JavaScript).

Lo más cerca que se puede hacer es llamar Car.class.getMethods()

Car.class es un objeto Class que se puede utilizar para invocar cualquiera de los métodos de reflexión.

Sin embargo, hasta donde yo sé, un método no es capaz de identificarse.

1

probar esto,

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

Puede obtener la cadena como esta:

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

Esto es para el caso de un método único en su clase. Si desea iterar a través de todos los métodos declarados, que tendrá que recorrer la matriz devuelta por Car.class.getDeclaredMethods():

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

Debe utilizar getDeclaredMethods() si desea ver todos ellos, solo se obtendrán getMethods()pública métodos.

Y, por último, si desea ver el nombre del método, que se está ejecutando en este momento, se debe utilizar este código:

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

esta forma se consigue un seguimiento de pila para el hilo y el retorno de la corriente el nombre del método en su parte superior.

+0

Gracias, me temo que realmente no quiero estar atado a la cosa de "un método por clase" ... puede – drozzy

+0

obtener todos los métodos de la clase o simplemente el método que se está ejecutando en este momento. Ver mis ediciones :) – Malcolm

+0

Gracias. Curioso. Pero sí necesito un nombre de un método que no se está ejecutando actualmente. Parece que Java no proporciona una forma de hacerlo ... – drozzy

-1

Espera, ya que ya conoces el nombre del método, ¿no puedes simplemente escribirlo como una cadena?

En lugar de (pseudo) Class.methodName.toString(), sólo tiene que utilizar "methodName".

contrario, puede utilizar Class#getDeclaredMethods() para obtener todos los métodos en una clase

+7

No quiero usar una cadena. Puedo refactorizar el nombre de mi método en el futuro. – drozzy

+1

IDEs tienen la capacidad de examinar cadenas cuando se refactoriza – Bozho

13

Por lo tanto, se desea obtener el nombre del método que se está ejecutando ? Aquí está una manera un tanto feo para hacer eso:

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

En realidad, this.getClass(). GetEnclosingMethod() funciona muy bien! – momomo

+0

momomo, no, no es así. clase Test { @Test public void testReflection() { assert (this.getClass(). GetEnclosingMethod() == null); } } –

Cuestiones relacionadas