2010-06-11 18 views
18

Come posso scoprire tramite riflessione qual è il nome stringa del metodo?Come ottenere il nome stringa di un metodo in java?

Per esempio dato:

class Car{ 
    public void getFoo(){ 
    } 
} 

voglio ottenere la stringa "getFoo", qualcosa di simile al seguente:

Car.getFoo.toString() == "getFoo" // TRUE 

risposta

15

Dal momento che i metodi non sono oggetti stessi, non hanno proprietà dirette (come ci si aspetterebbe con funzioni di prima classe in linguaggi come JavaScript).

Il più vicino si può fare è chiamare Car.class.getMethods()

Car.class è un oggetto Class che può essere utilizzato per richiamare uno dei metodi di riflessione.

Tuttavia, per quanto ne so, un metodo non è in grado di identificarsi.

1

provare questo,

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

È possibile ottenere la stringa in questo modo:

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

Questo è per il caso di un singolo metodo nella classe. Se si desidera per scorrere tutti i metodi dichiarati, dovrete scorrere la matrice restituita da Car.class.getDeclaredMethods():

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

Si dovrebbe usare getDeclaredMethods() se si desidera visualizzare tutti loro, getMethods() restituirà solo pubblico Metodi.

E infine, se si vuole vedere il nome del metodo, che è in esecuzione in questo momento, è necessario utilizzare questo codice:

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

In questo modo ottenere una traccia dello stack per il thread e il ritorno di corrente il nome del metodo in cima.

+0

Grazie, ho paura che non voglia essere legato alla cosa "one-metodo-per-class" ... Si può – drozzy

+0

ottieni tutti i metodi della classe o solo il metodo che viene eseguito al momento. Vedi le mie modifiche. :) – Malcolm

+0

Grazie. Curioso. Ma ho bisogno di un nome di un metodo che non è attualmente in esecuzione. Sembra che java non fornisca un modo per farlo ... – drozzy

-1

Attendi, dal momento che conosci già il nome del metodo, non puoi semplicemente inserirlo come stringa?

Invece di (pseudo) Class.methodName.toString(), basta usare "methodName".

In caso contrario è possibile utilizzare Class#getDeclaredMethods() per ottenere tutti i metodi di una classe

+7

Non voglio usare una stringa. Potrei refactoring il mio nome di metodo in futuro. – drozzy

+1

Gli IDE hanno la possibilità di esaminare le stringhe durante il refactoring – Bozho

13

Così, vuoi per ottenere il nome del metodo attualmente in esecuzione ? Ecco un modo un po 'brutto per farlo:

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

In realtà, this.getClass(). GetEnclosingMethod() funziona perfettamente! – momomo

+0

momomo, no, non è così. test di classe { @Test public void testReflection() { assert (this.getClass(). GetEnclosingMethod() == null); } } –

Problemi correlati