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/05/31 18:15:17 UTC

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

Marc Hadfield created GROOVY-7443:
-------------------------------------

             Summary: 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.4.3, 2.3.7
         Environment: jvm 1.7, MaxOSX
            Reporter: Marc Hadfield


this fails:
def aWithB = new ClassA().withTraits(traitB)
when traitB is not from the system classloader.

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)