Есть ли способ получить имя выполняемого в настоящее время метода в Java?
java
reflection
methods
Омар Кохеджи
источник
источник
Технически это будет работать ...
Тем не менее, новый анонимный внутренний класс будет создан во время компиляции (например
YourClass$1.class
). Так что это создаст.class
файл для каждого метода, который использует этот трюк. Кроме того, экземпляр неиспользуемого объекта создается при каждом вызове во время выполнения. Так что это может быть приемлемым приемом отладки, но он сопряжен со значительными накладными расходами.Преимущество этого трюка заключается в том, что он
getEncosingMethod()
возвращает результаты,java.lang.reflect.Method
которые можно использовать для получения всей другой информации о методе, включая аннотации и имена параметров. Это позволяет различать конкретные методы с одинаковым именем (перегрузка метода).Обратите внимание, что в соответствии с JavaDoc
getEnclosingMethod()
этого трюка неSecurityException
следует выдавать, поскольку внутренние классы должны загружаться с использованием того же загрузчика классов. Таким образом, нет необходимости проверять условия доступа, даже если присутствует менеджер безопасности.Требуется использовать
getEnclosingConstructor()
для конструкторов. В течение блоков вне (именованных) методовgetEnclosingMethod()
возвращаетnull
.источник
getEnclosingMethod
получает имя метода, в котором определен класс.this.getClass()
не поможет тебе вообще. @wutzebaer зачем тебе это вообще нужно? У вас уже есть доступ к ним.Январь 2009:
полный код будет (для использования с учетом предостережения @ Bombe ):
Подробнее в этом вопросе .
Обновление декабря 2011 года:
голубоватые комментарии:
virgo47 «s ответ (upvoted) фактически вычисляет указательный применять для того , чтобы получить обратно название метода.
источник
StackTraceElement
массив all для отладки и посмотреть, действительно ли 'main' является правильным методом?ste[2 + depth].getMethodName()
. 0 естьgetStackTrace()
, 1 естьgetMethodName(int depth)
и 2 вызывает метод. Смотрите также ответ @ virgo47 .Мы использовали этот код для уменьшения потенциальной изменчивости в индексе трассировки стека - теперь просто вызовите methodName util:
Кажется, слишком силен, но у нас было какое-то фиксированное число для JDK 1.5, и мы были немного удивлены, что оно изменилось, когда мы перешли на JDK 1.6. Теперь то же самое в Java 6/7, но вы просто никогда не знаете. Это не является доказательством изменений в этом индексе во время выполнения - но, надеюсь, HotSpot не делает это плохо. :-)
источник
имя будет иметь значение foo.
источник
null
Оба эти варианта работают для меня с Java:
Или:
источник
Самый быстрый способ, который я нашел, заключается в том, что:
Он напрямую обращается к собственному методу getStackTraceElement (int глубине). И сохраняет доступный метод в статической переменной.
источник
new Throwable().getStackTrace()
5614 мс.Используйте следующий код:
источник
источник
Это расширение ответа virgo47 (см. Выше).
Он предоставляет несколько статических методов для получения текущих и вызывающих имен классов / методов.
источник
Чтобы получить имя метода, вызвавшего текущий метод, вы можете использовать:
Это работает на моем MacBook, а также на моем телефоне Android
Я также попробовал:
но Android вернет "getStackTrace", я мог бы исправить это для Android с
но тогда я получаю неправильный ответ на моем MacBook
источник
getStackTrace()[0]
, чем использоватьgetStackTrace()[1]
. YMMV.Thread.currentThread().getStackTrace()[2]
Util.java:
SomeClass.java:
источник
final StackTraceElement e = Thread.currentThread().getStackTrace()[2];
работает;e.getClassName();
вернуть полное имя класса иe.getMethodName()
вернуть имя метона.getStackTrace()[2]
неправильно, это должно бытьgetStackTrace()[3]
потому, что: [0] dalvik.system.VMStack.getThreadStackTrace [1] java.lang.Thread.getStackTrace [2] Utils.getCurrentClassAndMethodNames [3] Функция a (), вызывающая этуЭто можно сделать с помощью
StackWalker
Java 9.StackWalker
разработан так, чтобы быть ленивым, поэтому он, вероятно, будет более эффективным, чем, скажем, тот,Thread.getStackTrace
который охотно создает массив для всего стека вызовов. Также см. JEP для получения дополнительной информации.источник
Альтернативный метод заключается в создании, но не создании исключения, и использовании этого объекта, из которого можно получить данные трассировки стека, поскольку метод включения обычно будет иметь индекс 0 - пока JVM хранит эту информацию, как это делают другие. упомянутый выше. Однако это не самый дешевый метод.
Из Throwable.getStackTrace () (это было так же, как минимум с Java 5):
В приведенном ниже фрагменте предполагается, что класс не является статичным (из-за getClass ()), но это в стороне.
источник
источник
У меня есть решение с помощью этого (в Android)
источник
Я не знаю, каково намерение получить имя исполняемого в данный момент метода, но если это только для целей отладки, то здесь могут помочь каркасы журналирования, такие как logback. Например, при входе в систему все, что вам нужно сделать, это использовать шаблон «% M» в вашей конфигурации ведения журнала . Однако это следует использовать с осторожностью, поскольку это может ухудшить производительность.
источник
В случае, если метод, имя которого вы хотите узнать, является тестовым методом junit, вы можете использовать правило TestName junit: https://stackoverflow.com/a/1426730/3076107
источник
Большинство ответов здесь кажется неправильным.
Пример:
Выходы:
источник
Я немного переписал ответ Маклеменца :
источник
источник
getEnclosingMethod()
бросаетNullPointerException
для меня в Java 7.Что не так с этим подходом:
И до того, как люди начнут сходить с ума от использования,
System.out.println(...)
вы всегда должны и должны создать какой-то метод для перенаправления вывода, например:источник