Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java groovy动态脚本执行问题:GroovyShell和GroovyClassLoader都不希望在传入类装入器的上下文中工作_Java_Groovy - Fatal编程技术网

Java groovy动态脚本执行问题:GroovyShell和GroovyClassLoader都不希望在传入类装入器的上下文中工作

Java groovy动态脚本执行问题:GroovyShell和GroovyClassLoader都不希望在传入类装入器的上下文中工作,java,groovy,Java,Groovy,我试图获得一个动态生成的groovy脚本,以从调用java程序继承类并实现接口。我传入了对groovy脚本求值的类的类加载器,但没有结果。我想知道我是否可以问一位Groovy专家我可能做错了什么 代码如下所示。在这两种情况下,在对脚本求值时,在调用代码的上下文中定义的类“X”都无法识别。我收到这样的信息 “Script1.groovy:3:无法解析类X” 不知道如何从以这种方式调用的脚本中捕获输出(SystemOutputInterceptor?),因此我将println更改为throw,以说明

我试图获得一个动态生成的groovy脚本,以从调用java程序继承类并实现接口。我传入了对groovy脚本求值的类的类加载器,但没有结果。我想知道我是否可以问一位Groovy专家我可能做错了什么

代码如下所示。在这两种情况下,在对脚本求值时,在调用代码的上下文中定义的类“X”都无法识别。我收到这样的信息 “Script1.groovy:3:无法解析类X”


不知道如何从以这种方式调用的脚本中捕获输出(
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!'))
        }
    }
}