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();
   }
 }