Как получить аннотацию путем извлечения метода исключения в Java? - PullRequest
6 голосов
/ 17 января 2011

На этот раз я хочу получить аннотацию из сгенерированного исключения. Мой пример кода выглядит так:

public class P {

    @MyAnnotation(stringValue = "FirstType", intValue = 999)
    public void test() throws Exception {
        // ...
        throw new NullPointerException();
   }

    @MyAnnotation(stringValue = "SecondType", intValue = 111)
    public void test(int a) throws Exception {  
        // ...
       throw new NullPointerException();
    }
}

Приведенный выше класс содержит 2 метода, и оба они генерируют исключение NullPointerException.

Теперь я могу использовать callerElement, чтобы получить исключение и узнать имя пакета, имя класса и номер строки, которые вызывают исключение. Вот мой код:

public class CallP {
    public static void main(String[] argv){
        P class_p = new P();

        StackTraceElement[] callerElement = null;
        try{
            class_p.test();
        }catch(Exception e){
            callerElement = e.getStackTrace();
            System.out.println(callerElement[0].toString());
        }
   }
}

В моем окне консоли я вижу сообщение

StackoverflowQuestion.P.test (P.java:9)

Мои вопросы 1. Как получить аннотацию в предложении catch? 2. При перегрузке метода (в классе P у меня есть два метода, называемых test), как получить аннотацию?

Это все мои вопросы. Спасибо, что потратили время на чтение.

1 Ответ

3 голосов
/ 17 января 2011

Вы можете использовать getClassName и getMethodName(), чтобы получить имя класса и метода, а затем использовать отражение, чтобы получить аннотацию.

Подсказка: Class.forName(...) затем, klass.getMethod(...) или getDeclaredMethod(...) или любой другой вариант, затем method.getAnnotations() или другой вариант. IMO, getMethod(String name, Class<?>... parameterTypes) соответствует вашим потребностям, вы можете передать параметр Type для получения нужного метода.

Примечание: Мы никак не можем это выяснить. Единственное отличие - номер строки. И я сомневаюсь, сможем ли мы использовать это, чтобы получить желаемый метод и его аннотации. Таким образом, единственное решение, которое приходит мне в голову, - это вообще не перегружать систему, и однозначно называть методы испытаний. Конечно, это будет обходной путь, но вы не думаете, что название должно быть достаточно наглядным, чтобы рассказать, что там будет тестироваться.

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