Skip to content

Instantly share code, notes, and snippets.

@jimwhite
Last active August 29, 2015 13:56
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jimwhite/9224553 to your computer and use it in GitHub Desktop.
Save jimwhite/9224553 to your computer and use it in GitHub Desktop.
A GroovyClassLoader that gathers up the bytecode that defines the classes it has compiled.
import org.codehaus.groovy.ast.ClassNode
import org.codehaus.groovy.control.CompilationUnit
import org.codehaus.groovy.control.SourceUnit
class MyGroovyClassLoader extends GroovyClassLoader {
MyGroovyClassLoader(ClassLoader parent) { super(parent) }
Map bytecodes = [:]
class MyClassCollector extends GroovyClassLoader.ClassCollector {
protected MyClassCollector(GroovyClassLoader.InnerLoader cl, CompilationUnit unit, SourceUnit su) {
super(cl, unit, su)
}
@Override
protected Class createClass(byte[] code, ClassNode classNode) {
bytecodes[classNode.name] = code
super.createClass(code, classNode)
}
}
@Override
protected GroovyClassLoader.ClassCollector createCollector(CompilationUnit unit, SourceUnit su) {
new MyClassCollector(new GroovyClassLoader.InnerLoader(this), unit, su)
}
}
def loader = new MyGroovyClassLoader(this.class.classLoader)
def scriptClassName = 'ScriptNameToLookFor'
// Compile via GroovyClassLoader:
// def script = loader.parseClass('println \'Hello\'', scriptClassName + '.groovy')
// Or go through GroovyShell:
def shell = new GroovyShell()
shell.loader = loader // Work around borked API/implementation
def script = shell.parse('println \'Hello\'', scriptClassName + '.groovy')
println loader.bytecodes.collectEntries { k, v -> [k, v.length] }
// ==>
// [ScriptNameToLookFor:6010]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment