Найти метод вызова в Java - PullRequest
5 голосов
/ 27 марта 2012

Короткая версия: мне нужно найти способ в Java найти предыдущий Method в стеке вызовов (обратите внимание на заглавную букву 'M' в методе - мне нужен фактический java.lang.reflect.Method объект).

Справочная информация: я работаю над расширением концепции Google Guava Preconditions.checkNotNull(...), которая позволит программисту одновременно проверять ВСЕ параметры на нулевое значение и создавать NPE на основе имен параметров вызывающего метода.Например:

public class MyClass
{
    public void myMethod(Object arg1, Integer arg2, String arg3)
    {
        MyPreconditions.checkAllNotNull(arg1, arg2, arg3);
    }
}

Так что, если первый аргумент был нулевым, то NPE может читать arg1 cannot be null (MyClass:myMethod(Object, Integer, String)

Я уже разобрался, как получить вызывающий Class, и яЯ могу получить имена параметров через Spring LocalVariableTableParameterNameDiscoverer (или через библиотеку Paranamer), который у меня есть Method.Единственная часть, которую я не могу понять - это как получить Method.

Я знаю, что вы можете использовать трассировку стека для получения метода name , но этоне помогает, если метод переопределен.Есть ли способ (даже с внутренними классами com.sun) получить реальный стек?Кроме того, я могу получить номер строки для вызывающего метода, поэтому есть ли способ найти номер строки Method, полученный из объекта Class?

Ответы [ 2 ]

3 голосов
/ 27 марта 2012

Thread.getStackTrace() дает вам текущую трассировку стека.Оттуда вы можете получить имя класса и имя метода (даже если метод переопределен, вы увидите точный класс там), и получить метод через отражение.

Но имо - это странно и не нужно.И что об этом - вы предоставляете сообщение, которое в основном уже присутствует в трассировке стека, которое будет сгенерировано в случае сбоя вызова Preconditions.

1 голос
/ 27 марта 2012

«Я знаю, что вы можете использовать трассировку стека для получения имени метода, но это не поможет, если метод переопределен». - Трассировка стека также содержит имя класса (и исходный файл) в правильной манере, даже если метод был переопределен.

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

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