[ https://issues.apache.org/jira/browse/GROOVY-7443?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14571293#comment-14571293 ]
Marc Hadfield commented on GROOVY-7443: --------------------------------------- Yes, we can try to make this into a pull request. We were trying a quick fix, but yes, the more general solution would be to check the parent first before the children. This will be in the PR. I'm not sure about identifying cases where the trait classloader happens to be a parent of the "current" classloader. We could document then as something to consider going ahead in order to construct the minimal combined classloader. > instantiating a class withTraits does not use the classloader of the trait > -------------------------------------------------------------------------- > > Key: GROOVY-7443 > URL: https://issues.apache.org/jira/browse/GROOVY-7443 > Project: Groovy > Issue Type: Bug > Components: groovy-runtime > Affects Versions: 2.3.7, 2.4.3 > Environment: jvm 1.7, MaxOSX > Reporter: Marc Hadfield > Labels: class-generation, traits, usertask > Attachments: GroovyTraitsClassloaderTest.groovy > > > this fails: > def aWithB = new ClassA().withTraits(traitB) > when traitB is not from the classloader of class A. > full example code: > {code:Java} > package groovy.lang.traits > import org.codehaus.groovy.control.CompilerConfiguration; > class GroovyTraitsClassloaderTest { > static class ClassA { > > } > > static trait TraitA { > > def aMethod() { > println "traitA method" > } > > } > > static main(args) { > > > def aWithA = new ClassA().withTraits(TraitA) > > aWithA.aMethod() > > > GroovyClassLoader gcl = new > GroovyClassLoader(Thread.currentThread().getContextClassLoader()); > > Class classB = gcl.parseClass("""\ > class ClassB {} > """) > > Class traitB = gcl.parseClass("""\ > trait TraitB { > > def bMethod() { > println "traitB method" > } > > } > """) > > //ok > def bWithA = classB.newInstance().withTraits(TraitA) > //ok > def bWithB = classB.newInstance().withTraits(traitB) > bWithB.bMethod() > > //fails > def aWithB = new ClassA().withTraits(traitB) > > aWithB.bMethod() > > > } > } > {code} -- This message was sent by Atlassian JIRA (v6.3.4#6332)