получить имя метода вложения - PullRequest
10 голосов
/ 29 июня 2010

по методу

public void foo(){
  //..    
}

Есть ли способ получить methodName (в данном случае foo) во время выполнения?

Я знаю, как получить имя класса через

this.getClass (). GetName ()

или получить все публичные методы через Method[] methods = this.getClass().getMethods(); Если у меня есть имя метода, параметры также будут важны, так как может быть несколько методов с одинаковым именем

Ответы [ 6 ]

5 голосов
/ 29 июня 2010

Я не уверен, зачем вам это нужно, но вы всегда можете создать new Throwable() и getStackTace(), а затем запросить StackTraceElement.getMethodName().

В качестве бонуса вы получаете весь стек стека до точки выполнения, а не только непосредственно включающий метод.

Похожие вопросы

5 голосов
/ 29 июня 2010

Отражение - это один из способов. Другой медленный и потенциально ненадежный способ - это трассировка стека.

StackTraceElement[] trace = new Exception().getStackTrace();
String name = trace[0].getMethodName();

Та же идея, но из темы :

StackTraceElement[] trace = Thread.currentThread().getStackTrace();
String name = trace[0].getMethodName();
4 голосов
/ 20 марта 2012

Я использую код, подобный следующему:

  /**
   * Proper use of this class is
   *     String testName = (new Util.MethodNameHelper(){}).getName();
   *  or
   *     Method me = (new Util.MethodNameHelper(){}).getMethod();
   * the anonymous class allows easy access to the method name of the enclosing scope.
   */
  public static class MethodNameHelper {
    public String getName() {
      final Method myMethod = this.getClass().getEnclosingMethod();
      if (null == myMethod) {
        // This happens when we are non-anonymously instantiated
        return this.getClass().getSimpleName() + ".unknown()"; // return a less useful string
      }
      final String className = myMethod.getDeclaringClass().getSimpleName();
      return className + "." + myMethod.getName() + "()";
    }

    public Method getMethod() {
      return this.getClass().getEnclosingMethod();
    }
}

Просто оставьте имя класса + "." расстаться и посмотреть, отвечает ли он вашим потребностям.

2 голосов
/ 07 января 2017

Используйте этот код:

System.out.println(new Throwable().getStackTrace()[0].getMethodName());
1 голос
/ 30 июня 2010

Вы можете жестко закодировать имя.

// The Annotation Processor will complain if the two method names get out of synch
class MyClass
{
    @HardCodedMethodName ( ) 
     void myMethod ( )
     {
          @ HardCodedMethodName // Untried but it seems you should be able to produce an annotation processor that compile time enforces that myname = the method name.
          String myname = "myMethod" ;
          ...
     }
}
0 голосов
/ 08 сентября 2013

Этот вопрос задавался несколько лет назад, но я думаю, что было бы целесообразно обобщить предыдущие ответы в более простом выражении:

String methodName = Thread.currentThread().getStackTrace()[2].getMethodName();

Несмотря на его уродство и процитированные проблемы надежности, он чистый иможет быть легко использован с Log.x() функциями для отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...