Java groovy动态脚本执行问题:GroovyShell和GroovyClassLoader都不希望在传入类装入器的上下文中工作
我试图获得一个动态生成的groovy脚本,以从调用java程序继承类并实现接口。我传入了对groovy脚本求值的类的类加载器,但没有结果。我想知道我是否可以问一位Groovy专家我可能做错了什么 代码如下所示。在这两种情况下,在对脚本求值时,在调用代码的上下文中定义的类“X”都无法识别。我收到这样的信息 “Script1.groovy:3:无法解析类X”Java groovy动态脚本执行问题:GroovyShell和GroovyClassLoader都不希望在传入类装入器的上下文中工作,java,groovy,Java,Groovy,我试图获得一个动态生成的groovy脚本,以从调用java程序继承类并实现接口。我传入了对groovy脚本求值的类的类加载器,但没有结果。我想知道我是否可以问一位Groovy专家我可能做错了什么 代码如下所示。在这两种情况下,在对脚本求值时,在调用代码的上下文中定义的类“X”都无法识别。我收到这样的信息 “Script1.groovy:3:无法解析类X” 不知道如何从以这种方式调用的脚本中捕获输出(SystemOutputInterceptor?),因此我将println更改为throw,以说明
不知道如何从以这种方式调用的脚本中捕获输出(
SystemOutputInterceptor
?),因此我将println
更改为throw
,以说明它确实有效
您需要做的是导入您想要使用的类。代码如下:
package sample
import org.codehaus.groovy.control.CompilerConfiguration
import org.codehaus.groovy.control.customizers.ImportCustomizer
import org.junit.Test
import java.lang.reflect.Method
public class GroovyPuzzler {
public static class X {
def hello2() {
throw new RuntimeException("bang!")
}
}
@Test
public void test1() {
def customizer = new ImportCustomizer()
customizer.addImport('X', 'sample.GroovyPuzzler.X')
def configuration = new CompilerConfiguration()
configuration.addCompilationCustomizers(customizer)
GroovyShell shell = new GroovyShell(configuration)
Object script = shell.evaluate(
"""
def sayHello() {
new X().hello2()
}
return this
"""
)
try {
Method m = script.getClass().getMethod("sayHello")
m.invoke(script)
fail()
} catch (Exception e) {
assertTrue(e.cause.message.equals('bang!'))
}
}
}
导入类!对我真傻。嘿,谢谢;^)
package sample
import org.codehaus.groovy.control.CompilerConfiguration
import org.codehaus.groovy.control.customizers.ImportCustomizer
import org.junit.Test
import java.lang.reflect.Method
public class GroovyPuzzler {
public static class X {
def hello2() {
throw new RuntimeException("bang!")
}
}
@Test
public void test1() {
def customizer = new ImportCustomizer()
customizer.addImport('X', 'sample.GroovyPuzzler.X')
def configuration = new CompilerConfiguration()
configuration.addCompilationCustomizers(customizer)
GroovyShell shell = new GroovyShell(configuration)
Object script = shell.evaluate(
"""
def sayHello() {
new X().hello2()
}
return this
"""
)
try {
Method m = script.getClass().getMethod("sayHello")
m.invoke(script)
fail()
} catch (Exception e) {
assertTrue(e.cause.message.equals('bang!'))
}
}
}