Community
Participate
Working Groups
Consider the following test aspect and class package m; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; @Aspect("pertarget(execution( public void m.M.run() ))") public class A { int i; @Around("execution( public void m.M.run() )") public void count() { System.out.println("tick " + (i++)); } } package m; public class M { public void run() { } public static void main(String[] args) { for (int i = 0; i < 3; i++) { new M().run(); } } } I get error message below when I run these class/aspect with LTW. No error message with compile time weaving. The code appears to work as expected in both cases. Tested with aspectj 1.5.3 and the latest dev build 20070611184800. More information: [java] loader (instance of sun/misc/Launcher$AppClassLoader): attempted duplicate class definition for name: "m/A$ajcMightHaveAspect" [java] java.lang.LinkageError: loader (instance of sun/misc/Launcher$AppClassLoader): attempted duplicate class definition for name: "m/A$ajcMightHaveAspect" [java] at java.lang.ClassLoader.defineClass1(Native Method) [java] at java.lang.ClassLoader.defineClass(ClassLoader.java:620) [java] at java.lang.ClassLoader.defineClass(ClassLoader.java:465) [java] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [java] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [java] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [java] at java.lang.reflect.Method.invoke(Method.java:597) [java] at org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor.defineClass(ClassLoaderWeavingAdaptor.java:745) [java] at org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor.access$100(ClassLoaderWeavingAdaptor.java:58) [java] at org.aspectj.weaver.loadtime.ClassLoaderWeavingAdaptor$1.acceptClass(ClassLoaderWeavingAdaptor.java:129) [java] at org.aspectj.weaver.tools.WeavingAdaptor$WeavingClassFileProvider$1.acceptResult(WeavingAdaptor.java:702) [java] at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1058) [java] at org.aspectj.weaver.tools.WeavingAdaptor.getAtAspectJAspectBytes(WeavingAdaptor.java:368) [java] at org.aspectj.weaver.tools.WeavingAdaptor.weaveClass(WeavingAdaptor.java:264) [java] at org.aspectj.weaver.loadtime.Aj.preProcess(Aj.java:78) [java] at org.aspectj.weaver.loadtime.ClassPreProcessorAgentAdapter.transform(ClassPreProcessorAgentAdapter.java:52) [java] at sun.instrument.TransformerManager.transform(TransformerManager.java:169) [java] at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:365) [java] at java.lang.ClassLoader.defineClass1(Native Method) [java] at java.lang.ClassLoader.defineClass(ClassLoader.java:620) [java] at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124) [java] at java.net.URLClassLoader.defineClass(URLClassLoader.java:260) [java] at java.net.URLClassLoader.access$000(URLClassLoader.java:56) [java] at java.net.URLClassLoader$1.run(URLClassLoader.java:195) [java] at java.security.AccessController.doPrivileged(Native Method) [java] at java.net.URLClassLoader.findClass(URLClassLoader.java:188) [java] at java.lang.ClassLoader.loadClass(ClassLoader.java:306) [java] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276) [java] at java.lang.ClassLoader.loadClass(ClassLoader.java:251) [java] at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) [java] at m.M.run(M.java) [java] at m.M.main(M.java:11)
just tried to recreate this but it works fine for me when LTW - could have been fixed by another change given the age of the bug. Incidentally the code doesn't print tick0/tick1/tick2, it prints tick0/tick0/tick0 and that is because for each invocation of run() a different instance of M is being used. Creating an M outside the loop and reusing it within the loop produces tick0/tick1/tick2. I've added this test to the regression suite anyway.