In the first case, the generated compare method is a generics bridge method
- which merely acts as a bridge from the (Object,Object) variant to your
(String,String).  If you look at the bytecode for it, you will see it calls
the other compare method.
AspectJ does not advise bridge methods, because they just delegate to the
'real' method.  If we did then in this case your advice would run twice if
you called the Object,Object version.

In your second case you provided your own compare(Object,Object) method and
so it was advised.

cheers,
Andy.

2008/9/3 Alex Villazon <[EMAIL PROTECTED]>

> Dear all,
>      I have a problem with the following aspect which can advice methods,
> depending on how it's compiled...
>
> public class A implements java.util.Comparator <String> {
>  public int compare(String a, String b) {
>   return 0;
>  }
> }
>
> javac generated a compare(Object, Object) method corresponding to
>
> public int compare(Object a, Object b) {
>  return compare((String)a, (String)b);
> }
>
> When weaving A.java with the following aspect, only the compare(String,
> String) method is adviced...
>
> public aspect Foo {
>  before() : execution(* *(..)) && !within(Foo) {}
> }
>
> javac A.java
> jar cvf a.jar A.class
> ajc -showWeaveInfo  -inpath a.jar -outjar woven.jar Foo.aj
> Join point 'method-execution(int A.compare(java.lang.String,
> java.lang.String))' in Type 'A' (A.java:3) advised by before advice from
> 'Foo' (Foo.aj:2)
>
> Now, if I add the compare(Object, Object) manually, the Foo aspect advice
> both compare(String, String) and compare(Object, Object) methods!!!!
>
> public class A implements java.util.Comparator /*<String> */ {
>  public int compare(String a, String b) {
>   return 0;
>  }
>  public int compare(Object a, Object b) {
>   return compare((String)a, (String)b);
>  }
> }
>
> javac A.java
> jar cvf a.jar A.class
> ajc -showWeaveInfo  -inpath a.jar -outjar woven.jar Foo.aj
> Join point 'method-execution(int A.compare(java.lang.String,
> java.lang.String))' in Type 'A' (A.java:3) advised by before advice from
> 'Foo' (Foo.aj:2)
>
> Join point 'method-execution(int A.compare(java.lang.Object,
> java.lang.Object))' in Type 'A' (A.java:6) advised by before advice from
> 'Foo' (Foo.aj:2)
>
> Curiously, the bytecode for compare(Object, Object) is strictly the same..
>  in both cases..
>
> public int compare(java.lang.Object, java.lang.Object);
>  Signature: (Ljava/lang/Object;Ljava/lang/Object;)I
>  Code:
>  Stack=3, Locals=3, Args_size=3
>  0:   aload_0
>  1:   aload_1
>  2:   checkcast       #2; //class java/lang/String
>  5:   aload_2
>  6:   checkcast       #2; //class java/lang/String
>  9:   invokevirtual   #3; //Method
> compare:(Ljava/lang/String;Ljava/lang/String;)I
>  12:  ireturn
>  LineNumberTable:
>  line 1: 0
>
>  Is this a bug of ajc?  I tested it with 1.6.1 and 1.6.2 (development
> version)
>
> Thanks a lot,
>
> Alex
>
>
>
> _______________________________________________
> aspectj-users mailing list
> [email protected]
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
_______________________________________________
aspectj-users mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to