You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Marc Hadfield (JIRA)" <ji...@apache.org> on 2015/06/02 23:02:49 UTC

[jira] [Commented] (GROOVY-7443) instantiating a class withTraits does not use the classloader of the trait

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

Marc Hadfield commented on GROOVY-7443:
---------------------------------------

an example fix is here:
https://github.com/vital-ai/incubator-groovy/blob/d9e7110ebeda2194177303e536b0d3a220566103/src/main/org/codehaus/groovy/runtime/ProxyGeneratorAdapter.java

essentially the Traits are iterated over to find their classloader(s), and a delegating classloader is used for the class definition/loading.


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