Технически это будет работать ...
String name = new Object(){}.getClass().getEnclosingMethod().getName();
Однако новый анонимный внутренний класс будет создан во время компиляции (например, YourClass$1.class
). Так что это создаст файл .class
для каждого метода, который использует этот трюк. Кроме того, экземпляр неиспользуемого объекта создается при каждом вызове во время выполнения. Так что это может быть приемлемым приемом отладки, но он сопряжен со значительными накладными расходами.
Преимущество этого трюка в том, что getEncosingMethod()
возвращает java.lang.reflect.Method
, который можно использовать для получения всей другой информации о методе, включая аннотации и имена параметров. Это позволяет различать конкретные методы с одинаковым именем (перегрузка метода).
Обратите внимание, что согласно JavaDoc getEnclosingMethod()
этот трюк не должен выдавать SecurityException
, поскольку внутренние классы должны загружаться с использованием того же загрузчика классов. Поэтому нет необходимости проверять условия доступа, даже если присутствует менеджер безопасности.
Требуется использовать getEnclosingConstructor()
для конструкторов. В блоках вне (именованных) методов getEnclosingMethod()
возвращает null
.