[ https://issues.apache.org/jira/browse/GROOVY-7443?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15403795#comment-15403795 ]
Paul King commented on GROOVY-7443: ----------------------------------- I am wondering about the behavior we expect from the context class loader. The following code works prior to the change: {code} class GroovyTraitsClassloaderTest extends GroovyTestCase { static class ClassA {} static trait Trait1 { def method1() { 'Trait1 method' } } void testTraitsWithClassloading() { def aWith1 = new ClassA().withTraits(Trait1) assert aWith1.method1() == 'Trait1 method' GroovyClassLoader gcl = getClass().classLoader // ** Class classB = gcl.parseClass('class ClassB {}') Class trait2 = gcl.parseClass('trait Trait2 { def method2() { "Trait2 method" } }') def bWith1 = classB.newInstance().withTraits(Trait1) def bWith2 = classB.newInstance().withTraits(trait2) assert bWith2.method2() == 'Trait2 method' def aWith2 = new ClassA().withTraits(trait2) assert aWith2.method2() == 'Trait2 method' } } {code} And the following currently fails but passes after the proposed change: {code} class GroovyTraitsClassloaderTest extends GroovyTestCase { static class ClassA {} static trait Trait1 { def method1() { 'Trait1 method' } } void testTraitsWithClassloading() { def aWith1 = new ClassA().withTraits(Trait1) assert aWith1.method1() == 'Trait1 method' GroovyClassLoader gcl = new GroovyClassLoader(Thread.currentThread().contextClassLoader) // ** Class classB = gcl.parseClass('class ClassB {}') Class trait2 = gcl.parseClass('trait Trait2 { def method2() { "Trait2 method" } }') def bWith1 = classB.newInstance().withTraits(Trait1) def bWith2 = classB.newInstance().withTraits(trait2) assert bWith2.method2() == 'Trait2 method' def aWith2 = new ClassA().withTraits(trait2) assert aWith2.method2() == 'Trait2 method' } } {code} The only line different is the one marked with the ** comment. > 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 > 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)