Как я могу узнать посредством отражения, каково имя строки метода?
Например, данный:
class Car{
public void getFoo(){
}
}
Я хочу получить строку "getFoo", что-то как следующее:
Car.getFoo.toString() == "getFoo" // TRUE
Поскольку методы не являются объектами, у них нет прямых свойств (как вы ожидаете от функций первого класса в языках типа JavaScript).
Самое близкое, что вы можете сделать, это вызвать Car.class.getMethods()
Car.class
- это Class
объект, который вы можете использовать для вызова любого из методов отражения.
Однако, насколько я знаю, метод не может идентифицировать себя.
Строку можно получить следующим образом:
Car.class.getDeclaredMethods()[0].getName();
Это для случая одного метода в вашем классе. Если вы хотите перебрать все объявленные методы, вам нужно будет перебрать массив, возвращенный Car.class.getDeclaredMethods ()
:
for (Method method : Car.class.getDeclaredMethods()) {
String name = method.getName();
}
Вы должны использовать getDeclaredMethods ()
, если вы хотите просмотреть их все, getMethods ()
вернет только общедоступные методы.
И, наконец, если вы хотите увидеть имя метода, который выполняется в данный момент, вы должны использовать этот код:
Thread.currentThread().getStackTrace()[1].getMethodName();
Это позволит получить трассировку стека для текущего потока и вернуть имя метода. на его вершине.
Подождите, поскольку вы уже знаете имя метода, не могли бы вы просто ввести его как строку?
Вместо (псевдо) Class.methodName.toString ()
, просто используйте "methodName
".
В противном случае вы можете использовать Class # getDeclaredMethods ()
, чтобы получить все методы в классе
Итак, вы хотите получить имя текущего выполняемого метода? Вот несколько уродливый способ сделать это:
Exception e = new Exception();
e.fillInStackTrace();
String methodName = e.getStackTrace()[0].getMethodName();
попробуйте это,
import java.lang.reflect.*;
public class DumpMethods {
public static void main(String args[]) {
try {
Class c = Class.forName(args[0]);
Method m[] = c.getDeclaredMethods();
for (int i = 0; i < m.length; i++)
System.out.println(m[i].toString());
} catch (Throwable e) {
System.err.println(e);
}
}
}