import org.aspectj.weaver.patterns.PatternParser;
import org.aspectj.weaver.patterns.PerClause;
import org.aspectj.weaver.patterns.PerSingleton;
+import org.aspectj.weaver.patterns.TypePattern;
/**
* Generates bytecode for concrete-aspect.
if (constructedAnnotation==null) {
return; // error occurred (and was reported), do not continue
}
+
+ String nameComponent = da.declareAnnotationKind.name().toLowerCase();
+ String declareName = new StringBuilder("ajc$declare_at_").append(nameComponent).append("_").append(decCounter).toString();
+ LazyMethodGen declareMethod = new LazyMethodGen(Modifier.PUBLIC, Type.VOID, declareName, Type.NO_ARGS, EMPTY_STRINGS, cg);
+ InstructionList declareMethodBody = declareMethod.getBody();
+ declareMethodBody.append(InstructionFactory.RETURN);
+ declareMethod.addAnnotation(constructedAnnotation);
+
+ DeclareAnnotation deca = null;
+ ITokenSource tokenSource = BasicTokenSource.makeTokenSource(da.pattern,null);
+ PatternParser pp = new PatternParser(tokenSource);
+
if (da.declareAnnotationKind==DeclareAnnotationKind.Method || da.declareAnnotationKind==DeclareAnnotationKind.Field) {
- String declareName = new StringBuilder("ajc$declare_at_").append(da.declareAnnotationKind==DeclareAnnotationKind.Method?"method":"field").append("_").append(decCounter).toString();
- LazyMethodGen declareMethod = new LazyMethodGen(Modifier.PUBLIC, Type.VOID, declareName, Type.NO_ARGS, EMPTY_STRINGS, cg);
- InstructionList declareMethodBody = declareMethod.getBody();
- declareMethodBody.append(InstructionFactory.RETURN);
- declareMethod.addAnnotation(constructedAnnotation);
-
- ITokenSource tokenSource = BasicTokenSource.makeTokenSource(da.pattern,null);
- PatternParser pp = new PatternParser(tokenSource);
ISignaturePattern isp = (da.declareAnnotationKind==DeclareAnnotationKind.Method?pp.parseCompoundMethodOrConstructorSignaturePattern(true):pp.parseCompoundFieldSignaturePattern());
- DeclareAnnotation deca = new DeclareAnnotation(da.declareAnnotationKind==DeclareAnnotationKind.Method?DeclareAnnotation.AT_METHOD:DeclareAnnotation.AT_FIELD, isp);
- deca.setAnnotationMethod(declareName);
- deca.setAnnotationString(da.annotation);
- AjAttribute attribute = new AjAttribute.DeclareAttribute(deca);
- cg.addAttribute(attribute);
- cg.addMethodGen(declareMethod);
+ deca = new DeclareAnnotation(da.declareAnnotationKind==DeclareAnnotationKind.Method?DeclareAnnotation.AT_METHOD:DeclareAnnotation.AT_FIELD, isp);
+ } else if (da.declareAnnotationKind==DeclareAnnotationKind.Type) {
+ TypePattern tp = pp.parseTypePattern();
+ deca = new DeclareAnnotation(DeclareAnnotation.AT_TYPE,tp);
}
+
+ deca.setAnnotationMethod(declareName);
+ deca.setAnnotationString(da.annotation);
+ AjAttribute attribute = new AjAttribute.DeclareAttribute(deca);
+ cg.addAttribute(attribute);
+ cg.addMethodGen(declareMethod);
}
/**
--- /dev/null
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.util.Collections;
+import java.util.*;
+
+public class Hello7 {
+
+
+ public static void main(String[] args) {
+ printAnnos(Hello7.class);
+ }
+
+ public static void printAnnos(Class clazz) {
+ try {
+ Annotation[] annos = clazz.getAnnotations();
+ System.out.println("Annotations on "+clazz.getName()+"? "+(annos!=null && annos.length!=0));
+ if (annos!=null && annos.length>0) {
+ List<Annotation> la = new ArrayList<Annotation>();
+ for (Annotation anno: annos) {
+ la.add(anno);
+ }
+ Collections.<Annotation>sort(la,new AnnoComparator());
+
+ System.out.println("Annotation count is "+annos.length);
+ for (Annotation anno: la) {
+ System.out.println(anno);
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ static class AnnoComparator implements Comparator<Annotation> {
+ public int compare(Annotation a, Annotation b) {
+ return a.toString().compareTo(b.toString());
+ }
+ }
+}