Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[aspectj-dev] Problems with after() advice and generics when using WeavingAdaptor

Hi,

 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.

  The problematic class is defined as follows:

import java.lang.reflect.*;
public class MyArray {
    public static <T> T[] test(T[] original, int newLength ,Class<? extends T[]> newType) {
   T[]copy = (T[])Array.newInstance(original.getClass().getComponentType(),newLength);
   return copy;
   } 
}

(the problem occurs even if the body of the method is "return null")...

The aspect that I'm using is:

import org.aspectj.lang.*;
public final aspect TraceAspect {
 static final pointcut allExecs() : (execution(* *(..)) || execution(*.new(..)));
 static private  JoinPoint.StaticPart _discovered = null;

 after(): allExecs() {
  _discovered = null;
 }
}

In the class AJInst.java I'm using the WeavingAdaptor to weave the class. 
I'm creating the WeavingAdaptor as follows:
  
 wa = new WeavingAdaptor(null,classpath, aspectpath); 

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.

  wovenclass = wa.weaveClass(classname, classBytes, true);


 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)

I compile the aspect using ajc ajc -argfile list.lst -outjar aspects.jar Then I compile MyArray.java and put it on in.jar If I weave it with ajc, it works without problem!!! ajc -inpath in.jar -aspectpath aspects.jar -outjar array.jar Now, to reproduce the problem I compile AJInst and try to weave MyArray.class javac -cp $ASPECTJ_HOME/lib/aspectjtools.jar:$bcel AJInst.java java -cp $ASPECTJ_HOME/lib/aspectjtools.jar:$bcel:. AJInst MyArray.class 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

Anybody has an idea, what could be?

There is an exception on class casting when enabling detailed debug and logging... (see later)

-- (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

 I don't understand why the ajc works fine, and the WeaverAdaptor fails... 


Cheers,

Alex


java -Daj.weaving.verbose=true -Dorg.aspectj.weaver.showWeaveInfo=true  -Dorg.aspectj.tracing.factory=default -Dorg.aspectj.tracing.debug=true -Dorg.aspectj.tracing.enabled=true  -Dorg.aspectj.tracing.messages=true  -cp  $ASPECTJ_HOME/lib/aspectjtools.jar:$bcel:.  AJInst MyArray.class

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


Attachment: TraceAspect.java
Description: Binary data

Attachment: MyArray.java
Description: Binary data

Attachment: list.lst
Description: Binary data

Attachment: classpath.lst
Description: Binary data

Attachment: aspectpath.lst
Description: Binary data

Attachment: AJInst.java
Description: Binary data


Back to the top