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

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

what seems to happens is that we use the loader of ClassA or ClassB to create 
the proxy. This loader may not know the trait class and then it would fail 
loading the proxy class. I think the OP was trying to create such a situation 
using the context loader. And I would say, that this is supposed to work 
regardless of the loader the interface comes from

> 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