[
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 _AspectJ_ are you using?
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/
Sent by:
Ron.Mann@xxxxxxx
To:
Matthew Webster/UK/IBM@IBMGB
cc:
Subject:
Re: [aspectj-users]
Oddity with @Around and proceed arguments
Matthew,
Originally I was using build 1.5.0-b64. As a result of your mail
I
switched to build 1.5.0_06-b05. I did a little more work that I'm
at a
loss to explain.
First, I tried the new Java install and had the same effect. Second,
I
tried the -XnoInline option and everything worked fine no matter which
style I used!?!
So I decide to change the A.java code to include both proceeds in the
same code just as a sanity check:
@Around("fooOfC( i )")
public void foo2( ProceedingJoinPoint pjp, int i) {
pjp.proceed( new Object[] { pjp.getTarget(),
i } );
pjp.proceed( new Object[] { i } );
}
and with noInline it worked in both cases.
runit
42
42
I removed all the classes, recompiled with the -XnoInline argument
removed as well :
runit
42
Exception in thread "main" java.lang.ClassCastException:
java.lang.Integer
at ron.interfacetest.M.bar_aroundBody1$advice(M.java:120)
at ron.interfacetest.M.main(M.java:10)
Must say I'm getting a bit beyond my depth here. I've enclosed the
javap output from both tests (inline.out being the failure case and
noinline.out being the success (i guess) case. Perhaps this might give
you a clue as to whats up. Thanks again very much for the assistence!
=Ron=
Matthew Webster wrote On 01/27/06 06:02,:
>
> 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
>
>------------------------------------------------------------------------
>
>_______________________________________________
>aspectj-users mailing list
>aspectj-users@xxxxxxxxxxx
>https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
>
Compiled from "M.java"
public class ron.interfacetest.M extends java.lang.Object{
private static final org.aspectj.lang.JoinPoint$StaticPart ajc$tjp_0;
public ron.interfacetest.M();
Code:
0:
aload_0
1:
invokespecial
#9; //Method java/lang/Object."<init>":()V
4:
return
public static void main(java.lang.String[]);
Code:
0:
new
#18; //class ron/interfacetest/C
3:
dup
4:
invokespecial
#19; //Method ron/interfacetest/C."<init>":()V
7:
astore_1
8:
aload_1
9:
bipush
42
11:
istore_2
12:
astore_3
13:
getstatic
#33; //Field ajc$tjp_0:Lorg/aspectj/lang/JoinPoint$StaticPart;
16:
aconst_null
17:
aload_3
18:
iload_2
19:
invokestatic
#39; //Method org/aspectj/runtime/internal/Conversions.intObject:(I)Ljava/lang/Object;
22:
invokestatic
#45; //Method org/aspectj/runtime/reflect/Factory.makeJP:(Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint;
25:
astore
4
27:
invokestatic
#64; //Method ron/interfacetest/A.aspectOf:()Lron/interfacetest/A;
30:
bipush
3
32:
anewarray
#4; //class java/lang/Object
35:
astore
5
37:
aload
5
39:
bipush
0
41:
aload_3
42:
aastore
43:
aload
5
45:
bipush
1
47:
iload_2
48:
invokestatic
#39; //Method org/aspectj/runtime/internal/Conversions.intObject:(I)Ljava/lang/Object;
51:
aastore
52:
aload
5
54:
bipush
2
56:
aload
4
58:
aastore
59:
new
#49; //class ron/interfacetest/M$AjcClosure1
62:
dup
63:
aload
5
65:
invokespecial
#52; //Method ron/interfacetest/M$AjcClosure1."<init>":([Ljava/lang/Object;)V
68:
invokevirtual
#58; //Method org/aspectj/runtime/internal/AroundClosure.linkClosureAndJoinPoint:()Lorg/aspectj/lang/ProceedingJoinPoint;
71:
iload_2
72:
invokevirtual
#68; //Method ron/interfacetest/A.foo2:(Lorg/aspectj/lang/ProceedingJoinPoint;I)V
75:
return
static {};
Code:
0:
new
#44; //class org/aspectj/runtime/reflect/Factory
3:
dup
4:
ldc
#71; //String M.java
6:
ldc
#73; //String ron.interfacetest.M
8:
invokestatic
#79; //Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;
11:
invokespecial
#82; //Method org/aspectj/runtime/reflect/Factory."<init>":(Ljava/lang/String;Ljava/lang/Class;)V
14:
astore_0
15:
aload_0
16:
ldc
#84; //String method-call
18:
aload_0
19:
ldc
#86; //String 1
21:
ldc
#87; //String bar
23:
ldc
#89; //String ron.interfacetest.C
25:
ldc
#91; //String int:
27:
ldc
#93; //String i:
29:
ldc
#95; //String
31:
ldc
#97; //String void
33:
invokevirtual
#101; //Method org/aspectj/runtime/reflect/Factory.makeMethodSig:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/aspectj/lang/reflect/MethodSignature;
36:
bipush
10
38:
invokevirtual
#105; //Method org/aspectj/runtime/reflect/Factory.makeSJP:(Ljava/lang/String;Lorg/aspectj/lang/Signature;I)Lorg/aspectj/lang/JoinPoint$StaticPart;
41:
putstatic
#33; //Field ajc$tjp_0:Lorg/aspectj/lang/JoinPoint$StaticPart;
44:
return
static final void bar_aroundBody0(ron.interfacetest.C, int, org.aspectj.lang.JoinPoint);
Code:
0:
aload_0
1:
iload_1
2:
invokevirtual
#23; //Method ron/interfacetest/C.bar:(I)V
5:
return
}
Compiled from "M.java"
public class ron.interfacetest.M extends java.lang.Object{
private static final org.aspectj.lang.JoinPoint$StaticPart ajc$tjp_0;
public ron.interfacetest.M();
Code:
0:
aload_0
1:
invokespecial
#9; //Method java/lang/Object."<init>":()V
4:
return
public static void main(java.lang.String[]);
Code:
0:
new
#18; //class ron/interfacetest/C
3:
dup
4:
invokespecial
#19; //Method ron/interfacetest/C."<init>":()V
7:
astore_1
8:
aload_1
9:
bipush
42
11:
istore_2
12:
astore_3
13:
getstatic
#33; //Field ajc$tjp_0:Lorg/aspectj/lang/JoinPoint$StaticPart;
16:
aconst_null
17:
aload_3
18:
iload_2
19:
invokestatic
#39; //Method org/aspectj/runtime/internal/Conversions.intObject:(I)Ljava/lang/Object;
22:
invokestatic
#45; //Method org/aspectj/runtime/reflect/Factory.makeJP:(Lorg/aspectj/lang/JoinPoint$StaticPart;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Lorg/aspectj/lang/JoinPoint;
25:
astore
4
27:
aload_3
28:
iload_2
29:
aload
4
31:
invokestatic
#69; //Method ron/interfacetest/A.aspectOf:()Lron/interfacetest/A;
34:
aload
4
36:
iload_2
37:
invokestatic
#73; //Method bar_aroundBody1$advice:(Lron/interfacetest/C;ILorg/aspectj/lang/JoinPoint;Lron/interfacetest/A;Lorg/aspectj/lang/ProceedingJoinPoint;I)V
40:
return
static {};
Code:
0:
new
#44; //class org/aspectj/runtime/reflect/Factory
3:
dup
4:
ldc
#82; //String M.java
6:
ldc
#84; //String ron.interfacetest.M
8:
invokestatic
#90; //Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;
11:
invokespecial
#93; //Method org/aspectj/runtime/reflect/Factory."<init>":(Ljava/lang/String;Ljava/lang/Class;)V
14:
astore_0
15:
aload_0
16:
ldc
#95; //String method-call
18:
aload_0
19:
ldc
#97; //String 1
21:
ldc
#98; //String bar
23:
ldc
#100; //String ron.interfacetest.C
25:
ldc
#102; //String int:
27:
ldc
#104; //String i:
29:
ldc
#106; //String
31:
ldc
#108; //String void
33:
invokevirtual
#112; //Method org/aspectj/runtime/reflect/Factory.makeMethodSig:(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/aspectj/lang/reflect/MethodSignature;
36:
bipush
10
38:
invokevirtual
#116; //Method org/aspectj/runtime/reflect/Factory.makeSJP:(Ljava/lang/String;Lorg/aspectj/lang/Signature;I)Lorg/aspectj/lang/JoinPoint$StaticPart;
41:
putstatic
#33; //Field ajc$tjp_0:Lorg/aspectj/lang/JoinPoint$StaticPart;
44:
return
private static final void bar_aroundBody0(ron.interfacetest.C, int, org.aspectj.lang.JoinPoint);
Code:
0:
aload_0
1:
iload_1
2:
invokevirtual
#23; //Method ron/interfacetest/C.bar:(I)V
5:
return
private static final void bar_aroundBody1$advice(ron.interfacetest.C, int,
org.aspectj.lang.JoinPoint, ron.interfacetest.A, org.aspectj.lang.ProceedingJoinPoint,
int);
Code:
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:
aload
4
53:
iconst_1
54:
anewarray
#4; //class java/lang/Object
57:
dup
58:
iconst_0
59:
iload
5
61:
invokestatic
#59; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
64:
aastore
65:
astore
8
67:
astore
9
69:
aload
8
71:
bipush
0
73:
aaload
74:
checkcast
#18; //class ron/interfacetest/C
77:
aload
8
79:
bipush
1
81:
aaload
82:
invokestatic
#77; //Method org/aspectj/runtime/internal/Conversions.intValue:(Ljava/lang/Object;)I
85:
aload
9
87:
invokestatic
#79; //Method bar_aroundBody0:(Lron/interfacetest/C;ILorg/aspectj/lang/JoinPoint;)V
90:
aconst_null
91:
pop
92:
return
}