Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[aspectj-users] Proposal of a Patch for Scala

Using the AspectJ weaver in Scala programs might result in exceptions like these (long paste ahead):

*

Oct 7, 2009 8:56:55 PM org.aspectj.weaver.tools.Jdk14Trace error
SEVERE: scala/collection/Iterator$$anon$3
org.aspectj.weaver.BCException: Whilst processing type 'Lscala/collection/Iterator$$anon$3;' - cannot cast the outer type to a reference type. Signature=Lscala/collection/Iterator$$anon; toString()=scala.collection.Iterator$$anon
when processing type mungers
when weaving

at org.aspectj.weaver.AbstractReferenceTypeDelegate.getFormalTypeParametersFromOuterClass(AbstractReferenceTypeDelegate.java:108) at org.aspectj.weaver.bcel.BcelObjectType.ensureGenericSignatureUnpacked(BcelObjectType.java:728) at org.aspectj.weaver.bcel.BcelObjectType.getSuperclass(BcelObjectType.java:209) at org.aspectj.weaver.ReferenceType.getSuperclass(ReferenceType.java:855) at org.aspectj.weaver.bcel.BcelWeaver.weaveParentsFor(BcelWeaver.java:1433)
        at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1257)
at org.aspectj.weaver.tools.WeavingAdaptor.getWovenBytes(WeavingAdaptor.java:423) at org.aspectj.weaver.tools.WeavingAdaptor.weaveClass(WeavingAdaptor.java:286)
        at org.aspectj.weaver.loadtime.Aj.preProcess(Aj.java:96)
at org.aspectj.weaver.loadtime.ClassPreProcessorAgentAdapter.transform(ClassPreProcessorAgentAdapter.java:52) at org.springframework.context.weaving.AspectJWeavingEnabler$AspectJClassBypassingClassFileTransformer.transform(AspectJWeavingEnabler.java:97) at org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver$FilteringClassFileTransformer.transform(InstrumentationLoadTimeWeaver.java:181)
        at sun.instrument.TransformerManager.transform(Unknown Source)
        at sun.instrument.InstrumentationImpl.transform(Unknown Source)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(Unknown Source)
        at java.security.SecureClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.defineClass(Unknown Source)
        at java.net.URLClassLoader.access$000(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
        at scala.collection.Iterator$.<init>(Iterator.scala:26)
        at scala.collection.Iterator$.<clinit>(Iterator.scala)
        at scala.package$.<init>(package.scala:15)
        at scala.package$.<clinit>(package.scala)
        at scala.Predef$.<init>(Predef.scala:65)
        at scala.Predef$.<clinit>(Predef.scala)
        at com.phrood.sack.Apple.<init>(Apple.scala:10)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
        at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:126) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:72) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:932) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:884) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:479) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450) at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:289) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:286) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:188) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:543) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:730) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:387) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93)
        at com.phrood.sack.Sack.run(Sack.scala:35)
Oct 7, 2009 8:56:55 PM org.aspectj.weaver.tools.Jdk14Trace info
INFO: Dumping to c:\Users\phkoester\Data\phrood\sack\target\sack-1.0-beta-1-bin\.\ajcore.20091007.205655.878.txt

*

The problem is that `BcelObjectType.getOuterClass' will transform the string `scala/collection/Iterator$$anon$3' to `scala/collection/Iterator$$anon', which---in `AbstractReferenceTypeDelegate.getFormalTypeParametersFromOuterClass'---does not result in an instance of `ReferenceType'.

In order to solve this problem and avoid this exception, I added three lines to `BcelObjectType.getOuterClass' like so:

*

String superClassName = className.substring(0, lastDollar);
final String anon = "$$anon"; // Scala
if (superClassName.endsWith(anon)) {
superClassName = superClassName.substring(0, superClassName.length() - anon.length());
}
UnresolvedType outer = UnresolvedType.forName(superClassName);

*

I'm not certain whether this is the definitive fix---all I can say is that it works for me: no exceptions any more, and working load-time weaving for Scala classes.

What would be the usual procedure to validate this code and possibly incorporate it into future versions of the weaver?

Regards
---Philip


Back to the top