2012-02-12 15 views
6

Voy a empezar con una pieza de códigoanotación que invoca un método

class Clazz { 

    public void doSomething() { 
     ... 
     check(); 
    } 

    public void doSomethingElse() { 
     ... 
     check(); 
    } 

    ... // etc., these methods look basically the same - they all call check() at the end 
} 

¿Es posible para anotar métodos como @Checked que causarían a llamar a la check() al final? Y si lo es, ¿puedes dar algunos ejemplos?

+1

No es posible fácilmente. Pero la pregunta es: ¿qué ganarías excepto la confusión? –

+0

@JBNizet Solo quiero saber si es posible y si no, aprendo algo nuevo. Mi problema real es mucho más complicado y espero poder simplificarlo con esto. – user219882

Respuesta

6

Sí - es posible. Necesita instrumentar su código, generalmente con aspectos (AOP). Consulte this example si quiere ver cómo se ve.

+0

Su respuesta no es correcta, su 'invoque su método' se ejecutará solo cuando refleje la clase y no cuando se llame al método. Puede usar Instrumentation para este propósito (https://github.com/jboss-javassist/javassist) o ajustar su código en los métodos generados (https://github.com/square/javapoet por ejemplo) – Spoke44

+0

@ Spoke44 you ' estas en lo correcto. Creo que debo haber entendido mal la pregunta. No estoy seguro de por qué fue aceptado y obtuve más votos positivos que la respuesta correcta. – javamonkey79

3

Se puede hacer con AOP. Eche un vistazo a AspectJ y Dynamic Proxy. Al usar un proxy dinámico, puede envolver su clase con otra pieza de código que realice algunas cosas antes y después de la llamada al método real.

+0

¿Podría compartir algún ejemplo o vínculo sobre cómo se puede lograr esto usando AspectJ/Dynamic Proxy? –

+0

@KiranAB, solo para ti http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html – AlexR

Cuestiones relacionadas