Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Re: annotated itd method not advised

I wouldn't have posted if I hadn't tried it ;)

This works for me, i've put your new aspect in there:

====8<========
package com.oni.tbdb.test.aspectj;

import java.lang.annotation.*;

@Retention(value=RetentionPolicy.RUNTIME)
@interface Wrap { }

interface Itd {}
@interface ItdFilter {}
@ItdFilter class Foo {}
class TestClass {}

public aspect WrapItd {

       public pointcut exec(Wrap w) :
               execution(@Wrap * *..*(..))
               && @annotation(w)
               ;//&& within(@ItdFilter *..*);

       declare parents : ((@ItdFilter *..*) && !Itd)
               implements Itd;

       public void Itd.method() {
               System.out.println("in method");
       }

       void around(Wrap w) : exec(w) {
               System.out.println("around before");
               proceed(w);
               System.out.println("around after");
       }

       @Wrap
       public void Itd.method2() {
               System.out.println("in method2");
       }

       @Wrap
       public void TestClass.method3() {
               System.out.println("in method3");
       }
}

====8<========
C:\aspectj1.5.3>ajc -1.5 -showWeaveInfo WrapItd.java
Join point 'method-execution(void
com.oni.tbdb.test.aspectj.Itd.method2())' in Type
'com.oni.tbdb.test.aspectj.WrapItd' (WrapItd.java:38) advised by
around advice from 'com.oni.tbdb.test.aspectj.WrapItd'
(WrapItd.java:31)

Join point 'method-execution(void
com.oni.tbdb.test.aspectj.TestClass.method3())' in Type
'com.oni.tbdb.test.aspectj.WrapItd' (WrapItd.java:43) advised by
around advice from 'com.oni.tbdb.test.aspectj.WrapItd'
(WrapItd.java:31)

Type 'com.oni.tbdb.test.aspectj.TestClass' (WrapItd.java) has
intertyped method from 'com.oni.tbdb.test.aspectj.WrapItd'
(WrapItd.java:'void com.oni.tbdb.test.aspectj.TestClass.method3()')

Extending interface set for type 'com.oni.tbdb.test.aspectj.Foo'
(WrapItd.java) to include 'com.oni.tbdb.test.aspectj.Itd'
(WrapItd.java)

Type 'com.oni.tbdb.test.aspectj.Foo' (WrapItd.java) has intertyped
method from 'com.oni.tbdb.test.aspectj.WrapItd' (WrapItd.java:'void
com.oni.tbdb.test.aspectj.Itd.method()')

Type 'com.oni.tbdb.test.aspectj.Foo' (WrapItd.java) has intertyped
method from 'com.oni.tbdb.test.aspectj.WrapItd' (WrapItd.java:'void
com.oni.tbdb.test.aspectj.Itd.method2()')

Type 'com.oni.tbdb.test.aspectj.Itd' (WrapItd.java) has intertyped
method from 'com.oni.tbdb.test.aspectj.WrapItd' (WrapItd.java:'void
com.oni.tbdb.test.aspectj.Itd.method()')

Type 'com.oni.tbdb.test.aspectj.Itd' (WrapItd.java) has intertyped
method from 'com.oni.tbdb.test.aspectj.WrapItd' (WrapItd.java:'void
com.oni.tbdb.test.aspectj.Itd.method2()')

Are you on the most recent AspectJ driver?
Are you binary weaving or compiling from source?
It may be something to do with types being in separate files whereas
all mine are in one.  If you discover that is the case, please raise a
bug - the ClassCastException is definetly a bug.

Andy.


On 13/09/2007, Michael McCray <mike@xxxxxxxxxxxxxxxxx> wrote:
> When I change my aspect like this as you suggest:
>
> package com.oni.tbdb.test.aspectj;
>
> public aspect WrapItd {
>
>         public pointcut exec(Wrap w) :
>                 execution(@Wrap * *..*(..))
>                 && @annotation(w)
>                 ;//&& within(@ItdFilter *..*);
>
>         declare parents : ((@ItdFilter *..*) && !Itd)
>                 implements Itd;
>
>         public void Itd.method() {
>                 System.out.println("in method");
>         }
>
>         void around(Wrap w) : exec(w) {
>                 System.out.println("around before");
>                 proceed(w);
>                 System.out.println("around after");
>         }
>
>         @Wrap
>         public void Itd.method2() {
>                 System.out.println("in method2");
>         }
>
>         @Wrap
>         public void TestClass.method3() {
>                 System.out.println("in method3");
>         }
> }
>
> I took out the within() for the pointcut, and it dod not advize.  I
> then added the last itd directly to the test class and I get an error
> when it compiles:
>
> java.lang.ClassCastException
> at org.aspectj.weaver.bcel.BcelShadow.getAnnotations(BcelShadow.java:1597)
> at org.aspectj.weaver.bcel.BcelShadow.initializeKindedAnnotationVars(BcelShadow.java:1675)
> at org.aspectj.weaver.bcel.BcelShadow.getKindedAnnotationVar(BcelShadow.java:1128)
> at org.aspectj.weaver.patterns.AnnotationPointcut.findResidueInternal(AnnotationPointcut.java:195)
> at org.aspectj.weaver.patterns.Pointcut.findResidue(Pointcut.ja ...
> db/test/aspectj/WrapItd;
>                     RETURN
>   end private static void ajc$postClinit()
> end public class com.oni.tbdb.test.aspectj.WrapItd
>
> It seems like I can not apply advice to introduced methods?
>
> Mike
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>


Back to the top