2011-01-17 23 views
5

Esta vez quiero obtener la anotación de la excepción lanzada. Mi código de ejemplo es la siguiente:Cómo obtener una anotación al recuperar el método de excepción en Java?

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(); 
    } 
} 

la clase anterior contienen 2 métodos, y dos de ellos arroja NullPointerException.

Ahora puedo usar callerElement para recuperar la excepción y conocer el nombre del paquete, el nombre de clase y el número de línea que causan la excepción. Aquí está mi código:

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()); 
     } 
    } 
} 

En mi ventana de la consola, puedo ver el mensaje

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

Mis preguntas son 1. ¿Cómo obtener la anotación en la cláusula catch? 2. Cuando la sobrecarga de métodos (en la clase P, tengo dos métodos llamados test), ¿cómo obtener la anotación?

Esas son todas mis preguntas. Gracias por pasar tiempo leyendo.

Respuesta

3

Puede usar getClassName y getMethodName(), para obtener la clase y el nombre del método, y luego usar el reflejo para obtener la anotación.

Pista:Class.forName(...) entonces, klass.getMethod(...) o getDeclaredMethod(...) o cualquier otra variante, entonces method.getAnnotations() u otra variante. IMO, getMethod(String name, Class<?>... parameterTypes) se adapta a su necesidad, puede pasar el parameterType para obtener el método deseado.

Nota: No hay forma de que podamos descubrirlo. Como la única diferencia es, el número de línea. Y lo dudo, si podemos hacer uso de eso para obtener el método deseado y sus anotaciones. Entonces, la única solución que viene a mi mente es evitar la sobrecarga en este caso, y nombrar los métodos de prueba de manera única. Por supuesto, sería un trabajo alternativo, pero ¿no crees que el nombre debería ser lo suficientemente descriptivo como para decir qué se probará allí?

+1

Hola, Adeel Ansari. Puedo usar callerElement [0] .getMethodName() para obtener el nombre del método. Sin embargo, no puedo saber cuál es el que quiero obtener (tengo dos "prueba()"). –

+0

@Charles: Sí, tienes razón. No hay forma de que podamos descubrirlo. Como la única diferencia es, el número de línea. Y lo dudo, si podemos hacer uso de eso para obtener el método deseado y sus anotaciones. –

Cuestiones relacionadas