JBoss.org Community Documentation
You can introduce annotations by annotating a field with the
@AnnotationIntroductionDef
in a class anotated with
@Aspect
or
@InterceptorDef
.
The declaration of
org.jboss.aop.AnnotationIntroductionDef
is:
package org.jboss.aop; @Target (ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface AnnotationIntroductionDef { String expr(); boolean invisible(); String annotation(); }
The parameters of
@AnnotationIntroductionDef
are:
expr
, pointcut matching the classes/constructors/methods/fields
we want to annotate.
invisible
, if true: the annotation's retention is RetentionPolicy.CLASS;
false: RetentionPolicy.RUNTIME
annotation
, the annotation we want to introduce.
The listings below make use of an annotation called
@com.mypackage.MyAnnotation
:
package com.mypackage; public interface MyAnnotation { String string(); int integer(); boolean bool(); }
What its parameters mean is not very important for our purpose.
The use of
@AnnotationIntroductionDef
:
package com.mypackage; import org.jboss.aop.AnnotationIntroductionDef: import org.jboss.aop.introduction.AnnotationIntroduction; @.InterceptorDef (scope=org.jboss.aop.advice.Scope.PER_VM) @org.jboss.aop.Bind (pointcut="all(com.blah.SomePOJO)") public class IntroducedAnnotationInterceptor implements Interceptor { @org.jboss.aop.AnnotationIntroductionDef \ (expr="method(* com.blah.SomePOJO->annotationIntroductionMethod())", \ invisible=false, \ annotation="@com.mypackage.MyAnnotation \ (string='hello', integer=5, bool=true)") public static AnnotationIntroduction annotationIntroduction; public String getName() { return "IntroducedAnnotationInterceptor"; } public Object invoke(Invocation invocation) throws Throwable { return invocation.invokeNext(); } }
Note that the reference to
@com.mypackage.MyAnnotation
must use the
fully qualified class name, and that the value for its string parameter uses single quotes.
The previous listings are the same as this XML configuration:
<annotation-introduction expr="method(* com.blah.SomePOJO->annotationIntroductionMethod()) invisible="false" > @com.mypackage.MyAnnotation (string="hello", integer=5, bool=true) </annotation-introduction>