Existe uma maneira de obter o nome do método atualmente em execução em Java?
java
reflection
methods
Omar Kooheji
fonte
fonte
Tecnicamente isso vai funcionar ...
No entanto, uma nova classe interna anônima será criada durante o tempo de compilação (por exemplo
YourClass$1.class
). Portanto, isso criará um.class
arquivo para cada método que implanta esse truque. Além disso, uma instância de objeto não utilizada é criada em cada chamada durante o tempo de execução. Portanto, esse pode ser um truque de depuração aceitável, mas ele vem com uma sobrecarga significativa.Uma vantagem desse truque é que
getEncosingMethod()
retornosjava.lang.reflect.Method
podem ser usados para recuperar todas as outras informações do método, incluindo anotações e nomes de parâmetros. Isso torna possível distinguir entre métodos específicos com o mesmo nome (sobrecarga de método).Observe que, de acordo com o JavaDoc
getEnclosingMethod()
deste truque, não deve ser lançadoSecurityException
como as classes internas devem ser carregadas usando o mesmo carregador de classes. Portanto, não há necessidade de verificar as condições de acesso, mesmo se um gerente de segurança estiver presente.É necessário usar
getEnclosingConstructor()
para construtores. Durante os blocos fora dos métodos (nomeados),getEnclosingMethod()
retornanull
.fonte
getEnclosingMethod
obtém o nome do método em que a classe está definida.this.getClass()
não vai te ajudar em nada. @wutzebaer Por que você precisaria? Você já tem acesso a eles.Janeiro de 2009:
Um código completo seria (para usar com a advertência de @ Bombe ):
Mais nesta pergunta .
Atualização em dezembro de 2011:
comentários azulados :
virgo47 's resposta (upvoted) realmente calcula o índice direito de aplicar a fim de obter de volta o nome do método.
fonte
StackTraceElement
matriz para fins de depuração e ver se 'main' é realmente o método certo?ste[2 + depth].getMethodName()
. 0 égetStackTrace()
, 1 égetMethodName(int depth)
e 2 está chamando o método. Veja também a resposta de @ virgo47 .Usamos esse código para reduzir a variabilidade potencial no índice de rastreamento de pilha - agora basta chamar methodName util:
Parece ser superengenharia, mas tínhamos um número fixo para o JDK 1.5 e ficamos um pouco surpresos ao mudar quando mudamos para o JDK 1.6. Agora é o mesmo no Java 6/7, mas você nunca sabe. Não é prova de alterações nesse índice durante o tempo de execução - mas espero que o HotSpot não seja tão ruim assim. :-)
fonte
nome terá valor foo.
fonte
null
Ambas as opções funcionam para mim com Java:
Ou:
fonte
A maneira mais rápida que encontrei é:
Ele acessa o método nativo getStackTraceElement (int depth) diretamente. E armazena o método acessível em uma variável estática.
fonte
new Throwable().getStackTrace()
levou 5614ms.Use o seguinte código:
fonte
fonte
Esta é uma expansão da resposta de virgo47 (acima).
Ele fornece alguns métodos estáticos para obter os nomes de classe / método atuais e invocadores.
fonte
Para obter o nome do método que chamou o método atual, você pode usar:
Isso funciona no meu MacBook e no meu telefone Android
Eu também tentei:
mas o Android retornará "getStackTrace". Eu poderia corrigir isso no Android com
mas então eu recebo a resposta errada no meu MacBook
fonte
getStackTrace()[0]
, em vez degetStackTrace()[1]
. YMMV.Thread.currentThread().getStackTrace()[2]
Util.java:
SomeClass.java:
fonte
final StackTraceElement e = Thread.currentThread().getStackTrace()[2];
trabalho;e.getClassName();
retorne o nome completo da classe ee.getMethodName()
retorne o nome methon.getStackTrace()[2]
está errado, deve sergetStackTrace()[3]
porque: [0] dalvik.system.VMStack.getThreadStackTrace [1] java.lang.Thread.getStackTrace [2] Utils.getCurrentClassAndMethodNames [3] A função a () chamando esteIsso pode ser feito usando o
StackWalker
Java 9.StackWalker
foi projetado para ser preguiçoso, então é provável que seja mais eficiente do que, digamos, oThread.getStackTrace
que cria ansiosamente uma matriz para todo o callstack. Veja também o JEP para mais informações.fonte
Um método alternativo é criar, mas não lançar, uma exceção e usar esse objeto do qual obter os dados de rastreamento de pilha, pois o método envolvente estará normalmente no índice 0 - desde que a JVM armazene essas informações, como outros Mencionado acima. Este não é o método mais barato, no entanto.
De Throwable.getStackTrace () (isso é o mesmo desde o Java 5, pelo menos):
O snippet abaixo assume que a classe não é estática (por causa de getClass ()), mas isso é um aparte.
fonte
fonte
Eu tenho solução usando isso (no Android)
fonte
Não sei qual é a intenção por trás do nome do método atualmente executado, mas se isso for apenas para fins de depuração, as estruturas de log como "logback" podem ajudar aqui. Por exemplo, no logback, tudo que você precisa fazer é usar o padrão "% M" na sua configuração de log . No entanto, isso deve ser usado com cuidado, pois isso pode prejudicar o desempenho.
fonte
Caso o método que você deseja saber seja um método de teste de junit, você poderá usar a regra TestName de junit: https://stackoverflow.com/a/1426730/3076107
fonte
A maioria das respostas aqui parece errada.
Exemplo:
Saídas:
fonte
Reescrevi um pouco a resposta do maklemenz :
fonte
fonte
getEnclosingMethod()
lança umNullPointerException
para mim em Java 7.O que há de errado com essa abordagem:
E antes que as pessoas fiquem loucas por usar,
System.out.println(...)
você sempre pode e deve criar algum método para que a saída possa ser redirecionada, por exemplo:fonte