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

A quick search of bugzilla for "org.aspectj.weaver.ResolvedType$Array"
reveals this bug, which I believe is your problem:

https://bugs.eclipse.org/bugs/show_bug.cgi?id=167197

you are correct that it is the array syntax causing the problem.

Andy.

On 08/01/2008, Alex Villazon <alex.villazon@xxxxxxxxxxx> wrote:
> 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
>
>
> _______________________________________________
> aspectj-dev mailing list
> aspectj-dev@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/aspectj-dev
>
>


Back to the top