I'm having problems when I weave a class containing methods that use generics. This problem happens when I use WeavingAdaptor and only with the "after" advice.
I'm using JDK1.6 and AspectJ 1.5.4, but the problem occurs in older versions as well.
The curious thing, is that when I use ajc to weave the class, it works fine... I don't know if this problem is related to how WeavingAdaptor uses the BcelWeaver or is related to a wrong usage of WeavingAdaptor or it's a bug related to generics handling.
where classpath is initialized using a file containing the path to rt.jar and aspectjtools.jar
and aspectpath is initialized using a file with the path to a jar containing the compiled TraceAspect.
I'm using null as first argument, because I'm handling classloading separately. All I'm interested is in the wovenclass, because I want to apply other instrumentations to it afterwards....
then, I'm invoking the weave method.
It seems that the combination of generics with the after advice is problematic... If I use other advice, e.g. before(), with generics, it works fine... or if I use after with anything without generics, it also works fine.
To reproduce the problem, I do the following: (sources are attached. You have to edit the classpath.lst and aspectpath.lst with the correct paths)
TraceFactory.instance=org.aspectj.weaver.tools.DefaultTraceFactory@b66cc
14:42:52.892 main I [WeavingAdaptor] info AspectJ Weaver Version 1.5.4 built on Thursday Dec 20, 2007 at 13:44:10 GMT
14:42:52.906 main I [WeavingAdaptor] info using classpath: [/Users/alexvillazon/Documents/work/usi/jdk-1.6/jre/lib/rt.jar, /Users/alexvillazon/Document
s/work/usi/aspectj/lib/aspectjtools.jar]
14:42:52.906 main I [WeavingAdaptor] info using aspectpath: [/Users/alexvillazon/Documents/work/usi/aj/aspects.jar]
14:42:52.942 main > org.aspectj.weaver.World$TypeMap.<init> org.aspectj.weaver.World$TypeMap@ae506e org.aspectj.weaver.bcel.BcelWorld@228a02
14:42:52.942 main < org.aspectj.weaver.World$TypeMap.<init>
14:42:52.944 main > org.aspectj.weaver.CrosscuttingMembersSet.<init> org.aspectj.weaver.CrosscuttingMembersSet@1d63e39 org.aspectj.weaver.bcel.BcelWorl
d@228a02
14:42:52.944 main < org.aspectj.weaver.CrosscuttingMembersSet.<init>
14:42:52.947 main > org.aspectj.weaver.Lint.<init> org.aspectj.weaver.Lint@ba6c83 org.aspectj.weaver.bcel.BcelWorld@228a02
14:42:52.947 main < org.aspectj.weaver.Lint.<init>
14:42:52.947 main > org.aspectj.weaver.World.<init> org.aspectj.weaver.bcel.BcelWorld@228a02
14:42:52.950 main > org.aspectj.weaver.Dump.registerNode class org.aspectj.weaver.bcel.BcelWorld, org.aspectj.weaver.bcel.BcelWorld@228a02
14:42:52.950 main < org.aspectj.weaver.Dump.registerNode 1
14:42:52.969 main < org.aspectj.weaver.World.<init>
14:42:52.970 main > org.aspectj.weaver.bcel.ClassPathManager.<init> org.aspectj.weaver.bcel.ClassPathManager@129f3b5 java.util.LinkedList(2), org.aspec
tj.weaver.tools.WeavingAdaptor$WeavingAdaptorMessageHolder@13f3045
14:42:52.972 main < org.aspectj.weaver.bcel.ClassPathManager.<init>
14:42:52.987 main > org.aspectj.weaver.bcel.BcelWeaver.<init> org.aspectj.weaver.bcel.BcelWeaver@11f2ee1 org.aspectj.weaver.bcel.BcelWorld@228a02
14:42:52.988 main < org.aspectj.weaver.bcel.BcelWeaver.<init>
14:42:52.988 main I [WeavingAdaptor] info adding aspect library: '/Users/alexvillazon/Documents/work/usi/aj/aspects.jar'
14:42:53.093 main > org.aspectj.weaver.CrosscuttingMembersSet.addOrReplaceAspect org.aspectj.weaver.CrosscuttingMembersSet@1d63e39 org.aspectj.weaver.R
eferenceType[TraceAspect], true
14:42:53.135 main < org.aspectj.weaver.CrosscuttingMembersSet.addOrReplaceAspect true
14:42:53.135 main > org.aspectj.weaver.bcel.BcelWeaver.prepareForWeave org.aspectj.weaver.bcel.BcelWeaver@11f2ee1
14:42:53.148 main < org.aspectj.weaver.bcel.BcelWeaver.prepareForWeave
14:42:53.189 main > org.aspectj.weaver.tools.WeavingAdaptor.weaveClass org.aspectj.weaver.tools.WeavingAdaptor@187814 MyArray.class, byte[610]
14:42:53.189 main ? [WeavingAdaptor] debug weaving 'MyArray.class'
14:42:53.191 main > org.aspectj.weaver.bcel.BcelWeaver.weave org.aspectj.weaver.bcel.BcelWeaver@11f2ee1 org.aspectj.weaver.tools.WeavingAdaptor$Weaving
ClassFileProvider@1c86be5
14:42:53.205 main > org.aspectj.weaver.bcel.BcelWeaver.weaveAndNotify org.aspectj.weaver.bcel.BcelWeaver@11f2ee1 org.aspectj.weaver.bcel.UnwovenClassFi
le@4e280c, org.aspectj.weaver.bcel.BcelObjectType@1275d39, org.aspectj.weaver.tools.WeavingAdaptor$WeavingClassFileProvider$1@1595f51
14:42:53.368 main ? [WeavingAdaptor] weaveinfo Join point 'constructor-execution(void MyArray.<init>())' in Type 'MyArray' (MyArray.java:2) advised by
after advice from 'TraceAspect' (aspects.jar!TraceAspect.class:10(from TraceAspect.java))
14:42:53.383 main X [WeavingAdaptor] abort trouble in:
public class MyArray extends java.lang.Object:
public void <init>():
ALOAD_0 (line 2)
INVOKESPECIAL java.lang.Object.<init> ()V
constructor-execution(void MyArray.<init>())
| catch java.lang.Throwable -> E0
| | GOTO L0
| catch java.lang.Throwable -> E0
| E0: ASTORE_1
| INVOKESTATIC TraceAspect.aspectOf ()LTraceAspect;
| INVOKEVIRTUAL TraceAspect.ajc$after$TraceAspect$1$4431da2 ()V
| ALOAD_1
| ATHROW
| L0: INVOKESTATIC TraceAspect.aspectOf ()LTraceAspect;
| INVOKEVIRTUAL TraceAspect.ajc$after$TraceAspect$1$4431da2 ()V
| RETURN
constructor-execution(void MyArray.<init>())
end public void <init>()
public static Object[] test(Object[], int, Class):
method-execution(java.lang.Object[] MyArray.test(java.lang.Object[], int, java.lang.Class))
| catch java.lang.Throwable -> E0
| | ALOAD_0 (line 11)
| | INVOKEVIRTUAL java.lang.Object.getClass ()Ljava/lang/Class;
| | INVOKEVIRTUAL java.lang.Class.getComponentType ()Ljava/lang/Class;
| | ILOAD_1
| | INVOKESTATIC java.lang.reflect.Array.newInstance (Ljava/lang/Class;I)Ljava/lang/Object;
| | CHECKCAST [Ljava.lang.Object;
| | CHECKCAST [Ljava.lang.Object;
| | ASTORE_3
| | ALOAD_3 (line 12)
| | ARETURN
| catch java.lang.Throwable -> E0
| E0: ASTORE 4
| INVOKESTATIC TraceAspect.aspectOf ()LTraceAspect;
| INVOKEVIRTUAL TraceAspect.ajc$after$TraceAspect$1$4431da2 ()V
| ALOAD 4
| ATHROW
method-execution(java.lang.Object[] MyArray.test(java.lang.Object[], int, java.lang.Class))
end public static Object[] test(Object[], int, Class)
end public class MyArray
-- (ClassCastException) org.aspectj.weaver.ResolvedType$Array cannot be cast to org.aspectj.weaver.ReferenceType
org.aspectj.weaver.ResolvedType$Array cannot be cast to org.aspectj.weaver.ReferenceType
java.lang.ClassCastException: org.aspectj.weaver.ResolvedType$Array cannot be cast to org.aspectj.weaver.ReferenceType
at org.aspectj.weaver.bcel.BcelGenericSignatureToTypeXConverter.typeArgument2TypeX(BcelGenericSignatureToTypeXConverter.java:187)
at org.aspectj.weaver.bcel.BcelGenericSignatureToTypeXConverter.classTypeSignature2TypeX(BcelGenericSignatureToTypeXConverter.java:94)
at org.aspectj.weaver.bcel.BcelGenericSignatureToTypeXConverter.fieldTypeSignature2TypeX(BcelGenericSignatureToTypeXConverter.java:131)
at org.aspectj.weaver.bcel.BcelGenericSignatureToTypeXConverter.typeSignature2TypeX(BcelGenericSignatureToTypeXConverter.java:217)
at org.aspectj.weaver.bcel.BcelGenericSignatureToTypeXConverter.typeSignature2TypeX(BcelGenericSignatureToTypeXConverter.java:202)
at org.aspectj.weaver.bcel.BcelMethod.unpackGenericSignature(BcelMethod.java:416)
at org.aspectj.weaver.bcel.BcelMethod.getGenericReturnType(BcelMethod.java:354)
at org.aspectj.weaver.Shadow.getReturnType(Shadow.java:262)
at org.aspectj.weaver.bcel.BcelShadow.hasANonVoidReturnType(BcelShadow.java:1884)
at org.aspectj.weaver.bcel.BcelShadow.generateReturnInstructions(BcelShadow.java:1857)
at org.aspectj.weaver.bcel.BcelShadow.weaveAfterReturning(BcelShadow.java:1802)
at org.aspectj.weaver.bcel.BcelShadow.weaveAfter(BcelShadow.java:1773)
at org.aspectj.weaver.bcel.BcelAdvice.implementOn(BcelAdvice.java:258)
at org.aspectj.weaver.Shadow.implementMungers(Shadow.java:711)
at org.aspectj.weaver.Shadow.implement(Shadow.java:483)
at org.aspectj.weaver.bcel.BcelClassWeaver.implement(BcelClassWeaver.java:2837)
at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:506)
at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:119)
at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1651)
at org.aspectj.weaver.bcel.BcelWeaver.weaveWithoutDump(BcelWeaver.java:1602)
at org.aspectj.weaver.bcel.BcelWeaver.weaveAndNotify(BcelWeaver.java:1380)
at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1200)
at org.aspectj.weaver.tools.WeavingAdaptor.getWovenBytes(WeavingAdaptor.java:360)
at org.aspectj.weaver.tools.WeavingAdaptor.weaveClass(WeavingAdaptor.java:262)
at AJInst.instrument(AJInst.java:92)
at AJInst.main(AJInst.java:65)
java.lang.ClassCastException: org.aspectj.weaver.ResolvedType$Array cannot be cast to org.aspectj.weaver.ReferenceType
java.lang.ClassCastException: org.aspectj.weaver.ResolvedType$Array cannot be cast to org.aspectj.weaver.ReferenceType
at org.aspectj.weaver.bcel.BcelGenericSignatureToTypeXConverter.typeArgument2TypeX(BcelGenericSignatureToTypeXConverter.java:187)
at org.aspectj.weaver.bcel.BcelGenericSignatureToTypeXConverter.classTypeSignature2TypeX(BcelGenericSignatureToTypeXConverter.java:94)
at org.aspectj.weaver.bcel.BcelGenericSignatureToTypeXConverter.fieldTypeSignature2TypeX(BcelGenericSignatureToTypeXConverter.java:131)
at org.aspectj.weaver.bcel.BcelGenericSignatureToTypeXConverter.typeSignature2TypeX(BcelGenericSignatureToTypeXConverter.java:217)
at org.aspectj.weaver.bcel.BcelGenericSignatureToTypeXConverter.typeSignature2TypeX(BcelGenericSignatureToTypeXConverter.java:202)
at org.aspectj.weaver.bcel.BcelMethod.unpackGenericSignature(BcelMethod.java:416)
at org.aspectj.weaver.bcel.BcelMethod.getGenericReturnType(BcelMethod.java:354)
at org.aspectj.weaver.Shadow.getReturnType(Shadow.java:262)
at org.aspectj.weaver.bcel.BcelShadow.hasANonVoidReturnType(BcelShadow.java:1884)
at org.aspectj.weaver.bcel.BcelShadow.generateReturnInstructions(BcelShadow.java:1857)
at org.aspectj.weaver.bcel.BcelShadow.weaveAfterReturning(BcelShadow.java:1802)
at org.aspectj.weaver.bcel.BcelShadow.weaveAfter(BcelShadow.java:1773)
at org.aspectj.weaver.bcel.BcelAdvice.implementOn(BcelAdvice.java:258)
at org.aspectj.weaver.Shadow.implementMungers(Shadow.java:711)
at org.aspectj.weaver.Shadow.implement(Shadow.java:483)
at org.aspectj.weaver.bcel.BcelClassWeaver.implement(BcelClassWeaver.java:2837)
at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:506)
at org.aspectj.weaver.bcel.BcelClassWeaver.weave(BcelClassWeaver.java:119)
at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1651)
at org.aspectj.weaver.bcel.BcelWeaver.weaveWithoutDump(BcelWeaver.java:1602)
at org.aspectj.weaver.bcel.BcelWeaver.weaveAndNotify(BcelWeaver.java:1380)
at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1200)
at org.aspectj.weaver.tools.WeavingAdaptor.getWovenBytes(WeavingAdaptor.java:360)
at org.aspectj.weaver.tools.WeavingAdaptor.weaveClass(WeavingAdaptor.java:262)
at AJInst.instrument(AJInst.java:92)
at AJInst.main(AJInst.java:65)
org.aspectj.bridge.AbortException: trouble in:
public class MyArray extends java.lang.Object:
public void <init>():
ALOAD_0 (line 2)
INVOKESPECIAL java.lang.Object.<init> ()V
constructor-execution(void MyArray.<init>())
| catch java.lang.Throwable -> E0
| | GOTO L0
| catch java.lang.Throwable -> E0
| E0: ASTORE_1
| INVOKESTATIC TraceAspect.aspectOf ()LTraceAspect;
| INVOKEVIRTUAL TraceAspect.ajc$after$TraceAspect$1$4431da2 ()V
| ALOAD_1
| ATHROW
| L0: INVOKESTATIC TraceAspect.aspectOf ()LTraceAspect;
| INVOKEVIRTUAL TraceAspect.ajc$after$TraceAspect$1$4431da2 ()V
| RETURN
constructor-execution(void MyArray.<init>())
end public void <init>()
public static Object[] test(Object[], int, Class):
method-execution(java.lang.Object[] MyArray.test(java.lang.Object[], int, java.lang.Class))
| catch java.lang.Throwable -> E0
| | ALOAD_0 (line 11)
| | INVOKEVIRTUAL java.lang.Object.getClass ()Ljava/lang/Class;
| | INVOKEVIRTUAL java.lang.Class.getComponentType ()Ljava/lang/Class;
| | ILOAD_1
| | INVOKESTATIC java.lang.reflect.Array.newInstance (Ljava/lang/Class;I)Ljava/lang/Object;
| | CHECKCAST [Ljava.lang.Object;
| | CHECKCAST [Ljava.lang.Object;
| | ASTORE_3
| | ALOAD_3 (line 12)
| | ARETURN
| catch java.lang.Throwable -> E0
| E0: ASTORE 4
| INVOKESTATIC TraceAspect.aspectOf ()LTraceAspect;
| INVOKEVIRTUAL TraceAspect.ajc$after$TraceAspect$1$4431da2 ()V
| ALOAD 4
| ATHROW
method-execution(java.lang.Object[] MyArray.test(java.lang.Object[], int, java.lang.Class))
end public static Object[] test(Object[], int, Class)
end public class MyArray
e