Java: получение текущего исполняемого метода, соответствующего объекту
Каков самый элегантный способ получить текущий исполняемый метод как объект метода?
Мой первый очевидный способ сделать это - использовать статический метод в классе-помощнике, который будет загружать текущий стек потока, получить правильный элемент трассировки стека и построить элемент Method из его информации.
Есть ли более элегантный способ достичь этого?
Ответы
Ответ 1
Из коробки я не знаю лучшего способа сделать это.
Одна вещь, которую следует учитывать, возможно, была бы аспектом - вы могли бы сплести аспект в код, который запускал все вызовы метода и переместил текущий объект Method
в ThreadLocal (на основе отражающей информации, доступной из точки соединения).
Это было бы, вероятно, слишком дорогостоящим, если бы оно действительно срабатывало во всех методах, но в зависимости от того, что вы делаете с результатами, вы можете ограничить захват определенных пакетов/классов, что могло бы помочь. Возможно, вы сможете отложить фактический поиск Method
до тех пор, пока он не используется, и вместо этого сохраните имя метода и аргументов и т.д.
У меня есть сомнения в том, будет ли особенно дешевый способ достичь этого.
Ответ 2
Этот вопрос рассматривается в более глубокой глубине в этом SO-вопросе.
Мне нужно сделать то же самое, и я нашел, что лучшим решением является тот, который предоставляется @alexsmail.
Кажется немного взломанным, но общая идея заключается в том, что вы объявляете локальный класс в методе, а затем используете class.getEnclosingMethod();
Код слегка изменен из решения @alexsmail:
public class SomeClass {
public void foo(){
class Local {};
Method m = Local.class.getEnclosingMethod();
}
}