Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] Oddity with @Around and proceed arguments


Ron,

Which version of the compiler are you using and which JDK? I have no problem using either AJDT or ajc with JDK 1.5.0_05 to build your code:

C:\workspaces\temp\Test\src>c:\aspectj1.5\bin\ajc -version
AspectJ Compiler 1.5.0 built on Tuesday Dec 20, 2005 at 12:05:54 GMT


C:\workspaces\temp\Test\src>c:\aspectj1.5\bin\ajc -d c:\temp\test -1.5 -showWeaveInfo -verbose -referenceInfo -argfile ..\files.lst
zipfile classpath entry does not exist: C:\jdk1.5.0_05\jre\lib\i18n.jar

zipfile classpath entry does not exist: C:\jdk1.5.0_05\jre\lib\sunrsasign.jar

directory classpath entry does not exist: C:\jdk1.5.0_05\jre\classes

compiling C:\workspaces\temp\Test\src\A.java

compiling C:\workspaces\temp\Test\src\C.java

compiling C:\workspaces\temp\Test\src\M.java

weaver operating in reweavable mode.  Need to verify any required types exist.

Join point 'method-call(void C.bar(int))' in Type 'M' (M.java:4) advised by around advice from 'A' (A.java:13)

Matthew Webster
AOSD Project
Java Technology Centre, MP146
IBM Hursley Park, Winchester,  SO21 2JN, England
Telephone: +44 196 2816139 (external) 246139 (internal)
Email: Matthew Webster/UK/IBM @ IBMGB, matthew_webster@xxxxxxxxxx

http://w3.hursley.ibm.com/~websterm/

Please respond to aspectj-users@xxxxxxxxxxx

Sent by:        aspectj-users-bounces@xxxxxxxxxxx

To:        aspectj-users@xxxxxxxxxxx
cc:        
Subject:        Re: [aspectj-users] Oddity with @Around and proceed arguments


Hi Matthew!

I  haven't yet explored runtime weaving yet.  At the moment I'm using
1.5.0 and doing static weaving. I was running ajc via a script which
looks like this:

#! /bin/sh
build=.

ajc -1.5\
   -cp $build:/files0/AOP/AspectJ/aspectj1.5/lib/aspectjrt.jar \
   -verbose \
   -showWeaveInfo \
   -referenceInfo \
   -d . -argfile files.lst

with a list file containing:
A.java
C.java
M.java

and getting the following exception when run:
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer
       at ron.interfacetest.M.bar_aroundBody1$advice(M.java:119)
       at ron.interfacetest.M.main(M.java:10)

A javap -c -private ron.interfacetest.M  shows where for some reason
there seems to be expected a push of two arguments, not one, and on the
first there is a checkcast (on type C):

  0:   aload   4
  2:   iconst_1
  3:   anewarray       #4; //class java/lang/Object
  6:   dup
  7:   iconst_0
  8:   iload   5
  10:  invokestatic    #53; //Method
java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
  13:  aastore
  14:  astore  6
  16:  astore  7
  18:  aload   6
  20:  bipush  0
  22:  aaload
  23:  checkcast       #18; //class ron/interfacetest/C
  26:  aload   6
  28:  bipush  1
  30:  aaload
  31:  invokestatic    #73; //Method
org/aspectj/runtime/internal/Conversions.intValue:(Ljava/lang/Object;)I
  34:  aload   7
  36:  invokestatic    #75; //Method
bar_aroundBody0:(Lron/interfacetest/C;ILorg/aspectj/lang/JoinPoint;)V
  39:  aconst_null
  40:  pop
  41:  return

When I add in the pjp.getTarget() back I get the following which
executes properly:

  0:   aload   4
  2:   iconst_2
  3:   anewarray       #4; //class java/lang/Object
  6:   dup
  7:   iconst_0
  8:   aload   4
  10:  invokeinterface #53,  1; //InterfaceMethod
org/aspectj/lang/ProceedingJoinPoint.getTarget:()Ljava/lang/Object;
  15:  aastore
  16:  dup
  17:  iconst_1
  18:  iload   5
  20:  invokestatic    #59; //Method
java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
  23:  aastore
  24:  astore  6
  26:  astore  7
  28:  aload   6
  30:  bipush  0
  32:  aaload
  33:  checkcast       #18; //class ron/interfacetest/C
  36:  aload   6
  38:  bipush  1
  40:  aaload
  41:  invokestatic    #77; //Method
org/aspectj/runtime/internal/Conversions.intValue:(Ljava/lang/Object;)I
  44:  aload   7
  46:  invokestatic    #79; //Method
bar_aroundBody0:(Lron/interfacetest/C;ILorg/aspectj/lang/JoinPoint;)V
  49:  aconst_null
  50:  pop
  51:  return

Hopefully this is helpful.

=Ron=


Matthew Webster wrote On 01/26/06 10:06,:

>
> Ron,
>
> How are you building and running the application? Which version of
> AspectJ are you using? It works for me using a hand-coded aop.xml file
> and load-time weaving support. I had to change the aspect a little to
> cope with the fact that the "proceed()" method throws Throwable but
> this is what I got:
>
> _Console_
> 84
> info AspectJ Weaver Version DEVELOPMENT built on Friday Jan 20, 2006
> at 10:29:42 GMT
> info register classloader
> org.aspectj.weaver.loadtime.WeavingURLClassLoader
> info using /C:/workspaces/temp/Test/bin/META-INF/aop.xml
> info register aspect A
> info weaving 'M'
> info generating class 'M$AjcClosure1'
> info weaving 'C'
> info weaving 'A'
>
> _A.java_
> import org.aspectj.lang.ProceedingJoinPoint;
> import org.aspectj.lang.annotation.Around;
> import org.aspectj.lang.annotation.Aspect;
> import org.aspectj.lang.annotation.Pointcut;
>
> @Aspect
> public class A {
>
>     @Pointcut( "call(void C.bar( int )) && args( i ) " )
>     void fooOfC( int i ) {}
>
>     @Around("fooOfC( i )")
>     public void foo2( ProceedingJoinPoint pjp, int i) throws Throwable {
> //            pjp.proceed( new Object[] { pjp.getTarget(), i } );
>         pjp.proceed( new Object[] { i*2 } );
>     }
> }
>
> _aop.xml_
> <?xml version="1.0" encoding="UTF-8"?>
> <aspectj>
>         <aspects>
>                 <aspect name="A"/>
>         </aspects>
>         <weaver options="-verbose"/>
> </aspectj>
>
> Cheers
>
> Matthew Webster
> AOSD Project
> Java Technology Centre, MP146
> IBM Hursley Park, Winchester,  SO21 2JN, England
> Telephone: +44 196 2816139 (external) 246139 (internal)
> Email: Matthew Webster/UK/IBM @ IBMGB, matthew_webster@xxxxxxxxxx
> http://w3.hursley.ibm.com/~websterm/
>
> Please respond to aspectj-users@xxxxxxxxxxx
>
> Sent by:        aspectj-users-bounces@xxxxxxxxxxx
>
> To:        aspectj-users@xxxxxxxxxxx
> cc:        
> Subject:        [aspectj-users] Oddity with @Around and proceed arguments
>
>
> Hi experts!
>
> I'm a newcomer to this technology, so forgive me if I've missed the
> obvious.  For various reasons, the project I'm working on is interesting
> in incorporating the annotation style for aspect declaration.  I've
> encountered an oddity which I'm unsure about.  In essense I have
> duplicated the @Around example in chapter 9 of the developers notebook
> (http://www.eclipse.org/aspectj/doc/released/adk15notebook/ataspectj-pcadvice.html)
> where each of the following classes are in a separate .java file:
>
>    public class M {
>        public static void main( String[] args ) {
>            C c = new C();
>            c.bar(42);
>        }
>    }
>
>    public class C {
>        public void bar(int i) {
>            System.out.println( i );
>        }
>    }
>
>    @Aspect
>    public class A {
>
>        @Pointcut( "call(void C.bar( int )) && args( i ) " )
>        void fooOfC( int i ) {}
>
>        @Around("fooOfC( i )")
>        public void foo2( ProceedingJoinPoint pjp, int i) {
>            pjp.proceed( new Object[] { pjp.getTarget(), i } );
>            /* Doc doesn't show this ---^^^^^^^^^^^^^^^
>             * Via the doc I should have passed just the int reference
> thus:
>             * pjp.proceed( new Object[] { i } );
>             */
>        }
>    }
>
> When I followed the example by only including the int in the Object
> array, I was getting a ClassCastException which after javap'ing the file
> indicated that the weaver appeared to be expecting two arguments rather
> than one.  The first (and missing arg) appearing to be the instance of
> object to proceed to.  By getting the target from the pjp reference and
> adding it to the array of objects passed, the problem seems to be solved
> and everything worked fine.  So, I'd just like to have confidence that
> what I'm doing is in fact the correct methodology and that this is a
> documentation oversight or alternately, that my limited understanding
> has resulted in me completely bolluxing everything up and things should
> be specified in a different way.
>
> Thanks for your help!!!
>
> =Ron=
>
>
> _______________________________________________
> aspectj-users mailing list
> aspectj-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
>------------------------------------------------------------------------
>
>_______________________________________________
>aspectj-users mailing list
>aspectj-users@xxxxxxxxxxx
>https://dev.eclipse.org/mailman/listinfo/aspectj-users
>  
>

_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users


Back to the top