Java: получение текущего выполняемого метода соответствующим объектом - PullRequest
12 голосов
/ 28 февраля 2011

Какой самый элегантный способ получить выполняемый в настоящее время метод как объект метода?

Мой первый очевидный способ сделать это - использовать статический метод в классе помощника, который бы загружал текущийстек потоков, получите правильный элемент трассировки стека и создайте элемент Method из его информации.

Есть ли более элегантный способ добиться этого?

Ответы [ 2 ]

16 голосов
/ 04 ноября 2013

Эта тема более глубоко рассмотрена в этом SO-вопросе .

Мне нужно сделать то же самое, и я нашел лучшее решение, предоставленное @ alexsmail.

Это выглядит немного странно, но общая идея состоит в том, что вы объявляете локальный класс в методе, а затем используете class.getEnclosingMethod();

Код, слегка измененный из решения @ alexsmail:

public class SomeClass {
   public void foo(){
      class Local {};
      Method m = Local.class.getEnclosingMethod();
   }
 }
2 голосов
/ 28 февраля 2011

Из коробки я не знаю лучшего способа сделать это.

Одна вещь, которую следует рассмотреть, возможно, это аспекты - вы можете встроить аспект в код, который запускает все вызовы метода и помещает текущий объект Method в ThreadLocal (на основе отражающей информации, доступной из точки соединения).

Это было бы, вероятно, слишком дорого, если бы оно действительно срабатывало на всех методах, но в зависимости от того, что вы делаете с результатами, вы можете ограничить захват определенными пакетами / классами, что бы помочь. Вы также можете отложить фактический поиск Method до тех пор, пока он не будет использован, и вместо этого сохранить имя метода, аргументы и т. Д.

Я сомневаюсь, что будет особенно дешевый способ достичь этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...