2015-02-16 23 views
7

Come si ottiene il nome del metodo di inclusione al momento della compilazione?Come posso ottenere il nome del metodo al momento della compilazione?

E perché è stato difficile per me capirlo? Perché Java non voleva che lo facessi? Non vedo alcun problema inerente con una caratteristica del genere, ed è utile per i nomi dei metodi di registrazione, senza doppioni tra la firma del metodo e la costante stringa in questo modo:

private void methodName() { 
    final String MN = "methodName"; 
    ... 

Qualcuno potrebbe cambiare il nome del metodo senza cambiare la Costante MN, quindi non riesco a trovarlo nel registro.

So che Java ha un metodo (riflettente?) Per fare ciò, ma perché chiunque vorrebbe complicare eccessivamente le cose e creare la possibilità di errori con una soluzione di runtime (per questo particolare problema) è oltre me.

Apparentemente i macro sono una cattiva pratica, ma penso che questo sia un caso di utilizzo piuttosto buono per loro. Questo è quello che sto fondamentalmente andando, qualcosa come una macro, una costante.

Btw, questa domanda è abbastanza simile:

Getting the name of the current executing method

Nessuna delle soluzioni sono costanti derivati ​​al momento della compilazione, però. Sono tutti calcoli runtime.


MODIFICA: Perché non è possibile farlo in fase di compilazione?

Si prega di non dare una risposta banale come "è così che è stato progettato Java", perché poi mi chiederò solo "perché?"

+0

* Quale * nome del metodo? Per favore spiega più chiaramente cosa stai cercando di realizzare esattamente. (La risposta potrebbe essere che è necessario utilizzare gli handle del metodo Java 8). – chrylis

+0

Se si utilizza un framework di registrazione, acquisire il nome del metodo è già stato risolto. –

+0

modificato per chrylis – Mike

risposta

0

Non a tempo di compilazione, ma ancora potrebbe funzionare per voi:

public class test1 { 
    public void display() { 
     try { 
      final String s = this.getClass().getMethod("display",null).toString(); 
      System.out.println(s); 
     } catch (NoSuchMethodException e) { 
      e.printStackTrace(); 
     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } 
    } 
    public static void main(String args[]) { 
     test1 obj = new test1(); 
     obj.display(); 
    } 
} 
+2

Com'è meglio della sua soluzione? Devi ancora digitare il nome del metodo a mano ... –

+1

Da java docs, getEnclosingMethod() - Se questo oggetto Class rappresenta una classe locale o anonima all'interno di un metodo, restituisce un oggetto Method che rappresenta il metodo immediatamente racchiuso della classe sottostante. Quindi, secondo la mia comprensione, funziona solo se esiste una classe all'interno di un metodo. Per la mia soluzione, è necessario digitare il nome del metodo ma si ottiene in cambio un nome completo. Se vuoi ottenere il nome del metodo al volo, non penso che sia possibile. –

2

Dalla risposta https://stackoverflow.com/a/5891326/4353712:

String name = new Object(){}.getClass().getEnclosingMethod().getName(); 

Tuttavia, come accennato nella risposta, questo genera un nuovo file .class ogni volta che lo usi