我知道您可以在Java中使用反射来获取运行时类,方法,字段等的名称。 我想知道一个方法可以找到自己的名字,而它的内部是自己的吗?另外,我也不想将方法的名称作为String参数传递。
例如
public void HelloMyNameIs() {
String thisMethodNameIS = //Do something, so the variable equals the method name HelloMyNameIs.
}
如果可能的话,我认为它可能涉及使用反射,但也许它不会。
如果有人知道,我们将不胜感激。
答案 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());
}