如何从已解析的Groovy脚本中查找类声明

问题描述

TL; DR:如何访问在动态解析的Groovy脚本中定义的类?

假设我有一个类似这样的常规脚本:

def foo(){ print "foo" }

def bar(){ print "bar" }

class Baz {
    def waz(){
        print "Baz#waz"
    }
}

...,我可以将其解析为这样的Script对象:

Script myScript = new groovyshell().parse(new File("my_script.groovy"))

那我知道我可以使用这些功能了:

myShell.foo()
myShell.bar()

但是如何访问Baz类声明?

谢谢

解决方法

默认情况下,groovyshell使用自己的类加载器来加载脚本和嵌套类。

因此,您可以通过类加载器访问它

def script = '''
def foo(){ print "foo" }

def bar(){ print "bar" }

class Baz {
    def waz(){
        print "Baz#waz"
    }
}
'''
def gshell = new GroovyShell()
Script myScript = gshell.parse(script)
myScript.foo()

println gshell.getClassLoader().loadClass('Baz')