方法可以使用Java中的反射找出自己的名称吗?

Posted

技术标签:

【中文标题】方法可以使用Java中的反射找出自己的名称吗?【英文标题】:Can a method figure out its own name using reflection in Java [duplicate] 【发布时间】:2011-10-18 16:34:49 【问题描述】:

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

例如

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

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

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

【问题讨论】:

不带反射,不,在这里回答:***.com/questions/442747/… 【参考方案1】:

用途:

public String getCurrentMethodName()

     StackTraceElement stackTraceElements[] = (new Throwable()).getStackTrace();
     return stackTraceElements[1].toString();

在你想要获取名字的方法里面。

public void HelloMyNameIs()

    String thisMethodNameIS = getCurrentMethodName();

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

【讨论】:

这种技术会影响性能,因此请谨慎使用。但这是您将获得的最佳解决方案。 @Kirk Woll:非常正确。因此,它真的不应该在发布版本中使用,仅用于调试目的。 为什么不使用 Thread.currentThread().getStackTrace() 而不是 new Throwable? 但其中只有一个创建了额外的 Throwable 对象 可以避免这种额外的对象创建,仅此而已【参考方案2】:

这个单行使用反射来工作:

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

缺点是代码不能移动到单独的方法中。

【讨论】:

【参考方案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 ( ) ;
      

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于方法可以使用Java中的反射找出自己的名称吗?的主要内容,如果未能解决你的问题,请参考以下文章

Java 反射编程(上)

java反射

Java 的方法可以“知道”它自己的名字吗? [复制]

别再说自己不会了!java反射技术强大吗

三大框架的底层是啥 反射? 反射和映射的区别是啥 我是学JAVA的

java反射调用方法可以传非基本类型吗?如对象、接口