Skip to main content

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

Hi again,
    
   The problem seems to be the use of wildcards with extends and the array declaration.... 

   When using after() advice and If the method has as argument the following generic declarations <? extends T[]>  or <? super T[]> there is a ClassCastException with the array T[]...
 
   This does not happen if the argument is for example  <? extends T>, i.e. without the array...

   Any idea? Thanks,

Alex




On Jan 8, 2008, at 3:01 PM, Alex Villazon wrote:

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


<TraceAspect.java><MyArray.java><list.lst><classpath.lst><aspectpath.lst><AJInst.java>
_______________________________________________
aspectj-dev mailing list
aspectj-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-dev


Back to the top