123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- import org.aspectj.lang.*;
- import org.aspectj.lang.reflect.*;
- import java.lang.annotation.*;
-
- @Retention(RetentionPolicy.RUNTIME)
- @interface Marker {
- String message();
- }
-
- public class AnnoBinding {
- public static void main(String []argv) {
- long stime = System.currentTimeMillis();
- for (int i=0;i<10000;i++) {
- runOne();
- }
- long etime = System.currentTimeMillis();
- long manual = (etime-stime);
- stime = System.currentTimeMillis();
- for (int i=0;i<10000;i++) {
- runTwo();
- }
- etime = System.currentTimeMillis();
- long woven = (etime-stime);
- System.out.println("woven="+woven+" manual="+manual);
- if (woven>manual) {
- throw new RuntimeException("woven="+woven+" manual="+manual);
- }
- if (X.a!=X.b) {
- throw new RuntimeException("a="+X.a+" b="+X.b);
- }
- }
-
- @Marker(message="string")
- public static void runOne() {
- }
-
- @Marker(message="string")
- public static void runTwo() {
- }
-
- static Annotation ajc$anno$1;
- }
-
- aspect X {
-
- pointcut pManual(): execution(@Marker * runOne(..));
- pointcut pWoven(Marker l): execution(@Marker * runTwo(..)) && @annotation(l);
-
- public static int a,b;
-
- before(): pManual() {
- Marker marker = (Marker) ((MethodSignature) thisJoinPointStaticPart.getSignature()).getMethod().getAnnotation(Marker.class);
- String s = marker.message();
- a+=s.length();
- }
-
- before(Marker l): pWoven(l) {
- String s = l.message();
- b+=s.length();
- }
- }
-
- //
- //0: invokestatic #96; //Method X.aspectOf:()LX;
- //3: getstatic #108; //Field ajc$anno$0:Ljava/lang/Annotation;
- //6: dup
- //7: ifnonnull 30
- //10: ldc #1; //class AnnoBinding
- //12: ldc #109; //String runTwo
- //14: iconst_0
- //15: anewarray #111; //class java/lang/Class
- //18: invokevirtual #115; //Method java/lang/Class.getDeclaredMethod:(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Me
- //d;
- //21: ldc #104; //class Marker
- //23: invokevirtual #121; //Method java/lang/reflect/Method.getAnnotation:(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
- //26: dup
- //27: putstatic #108; //Field ajc$anno$0:Ljava/lang/Annotation;
- //30: nop
- //31: checkcast #104; //class Marker
- //34: invokevirtual #125; //Method X.ajc$before$X$2$ea6844ce:(LMarker;)V
- //37: return
|