一个方法可以使用Java中的反射来找出自己的名称

时间:2011-08-02 23:16:04

标签: java reflection methods

我知道您可以在Java中使用反射来获取运行时类,方法,字段等的名称。 我想知道一个方法可以找到自己的名字,而它的内部是自己的吗?另外,我也不想将方法的名称作为String参数传递。

例如

public void HelloMyNameIs() {
  String thisMethodNameIS = //Do something, so the variable equals the method name HelloMyNameIs. 
}

如果可能的话,我认为它可能涉及使用反射,但也许它不会。

如果有人知道,我们将不胜感激。

4 个答案:

答案 0 :(得分:9)

使用:

public String getCurrentMethodName()
{
     StackTraceElement stackTraceElements[] = (new Throwable()).getStackTrace();
     return stackTraceElements[1].toString();
}

在您想要获取名称的方法内。

public void HelloMyNameIs()
{
    String thisMethodNameIS = getCurrentMethodName();
}

(不反思,但我认为不可能。)

答案 1 :(得分:6)

这个单行使用反射:

public void HelloMyNameIs() {
  String thisMethodNameIS = new Object(){}.getClass().getEnclosingMethod().getName();
}

缺点是代码无法移动到单独的方法。

答案 2 :(得分:3)

使用代理所有方法(覆盖接口中定义的方法)都可以知道自己的名称。

import java . lang . reflect . * ;

interface MyInterface
{
      void myfun ( ) ;
}

class MyClass implements MyInterface
{
      public void myfun ( ) { /* implementation */ }
}

class Main
{
      public static void main ( String [ ] args )
      {
            MyInterface m1 = new MyClass ( ) ;
            MyInterface m2 = ( MyInterface ) ( Proxy . newProxyInstance (
                  MyInterface . class() . getClassLoader ( ) ,
                  { MyInterface . class } ,
                  new InvocationHandler ( )
                  {
                        public Object invokeMethod ( Object proxy , Method method , Object [ ] args ) throws Throwable
                        {
                             System . out . println ( "Hello.  I am the method " + method . getName ( ) ) ;
                             method . invoke ( m1 , args ) ;
                        }
                  }
            ) ) ;
            m2 . fun ( ) ;
      }
}

答案 3 :(得分:0)

来自当前线程的堆栈跟踪:

public void aMethod() {  
    System.out.println(Thread.currentThread().getStackTrace()[0].getMethodName()); 
}