groovy-notifications mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jochen Theodorou (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (GROOVY-7443) instantiating a class withTraits does not use the classloader of the trait
Date Wed, 03 Jun 2015 06:33:49 GMT

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

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

fancy to make this into a pull request? You would have to change the tabs to 4 spaces though.
As for the fix I have a question... why don't you try the parent loader first? You could catch
the exception and safe it to rethrow it later, if the interfaces class loaders are not successful.
At least if the loader is supposed to be well behaving and complying to the classloading constraints.

Also, technically you could avoid adding classloaders to the interface classloader set, if
they are a parent of the parent loader... Though that is assuming well behaving class loaders
- of classloaders we don't know, so I am not sure that should be really done. Just mentioning
it for documentation actually.

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

Mime
View raw message