[ 
https://issues.apache.org/jira/browse/GROOVY-7443?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15403831#comment-15403831
 ] 

Jochen Theodorou commented on GROOVY-7443:
------------------------------------------

ClassA and Trait1 is known to getClass().classLoader, gcl has this loader as 
parent and knows Trait2, ClassB as well as ClassA and Trait1. Thus if you want 
to use withTraits for Trait1 the gcl must be selected as the loader (or a 
loader with gcl as parent) used for the proxy. And if the traits come from 
independent interfaces and loaders, a new loader must be used, that has 
multiple parents. So while the PR cannot be accepted as is, it goes in the 
right direction imho. I would not start on the context loader here

> 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)

Reply via email to