如何在java中获取方法的字符串名称?

And*_*yuk 26 java reflection

如何通过反射找出方法的字符串名称?

例如给出:

class Car{
   public void getFoo(){
   }
}
Run Code Online (Sandbox Code Playgroud)

我想得到字符串"getFoo",如下所示:

 Car.getFoo.toString() == "getFoo" // TRUE
Run Code Online (Sandbox Code Playgroud)

Mal*_*olm 36

您可以像这样获取String:

Car.class.getDeclaredMethods()[0].getName();
Run Code Online (Sandbox Code Playgroud)

这适用于您班级中单个方法的情况.如果要遍历所有声明的方法,则必须遍历返回的数组Car.class.getDeclaredMethods():

for (Method method : Car.class.getDeclaredMethods()) {
    String name = method.getName();
}
Run Code Online (Sandbox Code Playgroud)

您应该使用,getDeclaredMethods()如果要查看所有这些,getMethods()将仅返回公共方法.

最后,如果要查看此时正在执行的方法的名称,则应使用以下代码:

Thread.currentThread().getStackTrace()[1].getMethodName();
Run Code Online (Sandbox Code Playgroud)

这将获得当前线程的堆栈跟踪,并在其顶部返回方法的名称.

  • 嗨,通过执行Thread.currentThread().getStackTrace()[0] .getMethodName(); 你得到堆栈中的第一个方法,那个时候是"getStackTrace",你应该做Thread.currentThread().getStackTrace()[1] .getMethodName(); 为了获得具有代码行的那个,如果你想要解耦这个方法所以你不必在每个地方复制它我建议在类中使它静态并用[2]调用它,我没有我认为这似乎是它工作的逻辑. (7认同)
  • 在 Android 上,方法名称位于第三个元素中:Thread.currentThread().getStackTrace()[2].getMethodName() (2认同)

Mat*_*att 20

由于方法本身不是对象,因此它们没有直接属性(就像您期望在JavaScript等语言中使用第一类函数).

你最接近的就是打电话 Car.class.getMethods()

Car.class是一个Class可用于调用任何反射方法的对象.

但是,据我所知,一种方法无法识别自己.


Jes*_*per 14

那么,您想获取当前正在执行的方法的名称吗?这是一个有点难看的方式:

Exception e = new Exception();
e.fillInStackTrace();
String methodName = e.getStackTrace()[0].getMethodName();
Run Code Online (Sandbox Code Playgroud)


oli*_*mir 7

看看这个线程:

获取当前正在执行的方法的名称

它提供了更多的解决方案 - 例如:

String name = new Object(){}.getClass().getEnclosingMethod().getName();
Run Code Online (Sandbox Code Playgroud)