<address id="xhxt1"><listing id="xhxt1"></listing></address><sub id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></sub>

    <thead id="xhxt1"><dfn id="xhxt1"><ins id="xhxt1"></ins></dfn></thead>

    嵌入Groovy

    原文链接??译者:?李璟(jlee381344197@gmail.com)

    (本站正在翻译groovy系列文章,有兴趣同学可以加入我们)

    Groovy就其本身而言,在不同的场景下都算是一门非常不错的编程语言,特别是在与Java混用的环境下,Groovy显得更加强大。出于这种考虑,Groovy被设计成非常轻量级,并且易于嵌入到任何Java应用系统中。

    目前主要有3种方法将Groovy与Java集成起来,细节会在下文中讨论。

    还有一种可选方案是,如果你确实需要使用其他脚本语言,可以利用Bean?Scripting?Framework将任何脚本语言集成到你的Java代码中(虽然我们难以想象这么做的原因)。

    利用shell执行脚本或者表达式

    你可以使用GroovyShell执行Groovy中的任何表达式或者脚本。

    GroovyShell允许你通过Binding对象传进和传出变量。

    // call groovy expressions from Java code
    Binding binding = new Binding();
    
    binding.setVariable("foo", new Integer(2));
    
    GroovyShell shell = new GroovyShell(binding);
    
    Object value = shell.evaluate("println 'Hello World!'; x = 123; return foo * 10");
    
    assert value.equals(new Integer(20));
    
    assert binding.getVariable("x").equals(new Integer(123));
    

    利用一个常用基类执行脚本

    将Groovy脚本继承自一个你选择的基类,之后便可以访问脚本的常规方法,这种做法往往非常有用??梢酝ü诒嘁肱渲弥猩柚媒疟净嗍粜?,并将新的编译配置传递给shell完成这一操作。

    class ScriptBaseTest {
    
        @Test void extend_groovy_script() {
    
            def configuration = new CompilerConfiguration()
    
            configuration.setScriptBaseClass("ScriptBaseTestScript")
    
            def shell = new GroovyShell(this.class.classLoader, new Binding(), configuration)
    
            assertEquals shell.evaluate("foo()"), "this is foo"
    
        }
    
    }
    
    abstract class ScriptBaseTestScript extends Script {
    
        def foo() {
    
            "this is foo"
    
        }
    
    }
    

    在Java中动态加载和运行Groovy脚本

    你可以在Java代码中直接使用GroovyClassLoader动态地加载和执行Groovy类。Java代码如下:

    ClassLoader parent = getClass().getClassLoader(); 
    
    GroovyClassLoader loader = new GroovyClassLoader(parent); 
    
    Class groovyClass = loader.parseClass(new File("src/test/groovy/script/HelloWorld.groovy")); 
    
    // let's call some method on an instance
    GroovyObject groovyObject = (GroovyObject) groovyClass.newInstance(); 
    
    Object[] args = {}; 
    
    groovyObject.invokeMethod("run", args);
    

    如果你想在Java里使用一个接口,但是接口的实现在Groovy脚本中,可以这样:

    GroovyClassLoader gcl = new GroovyClassLoader(); 
    
    Class clazz = gcl.parseClass(myStringwithGroovyClassSource, "SomeName.groovy"); 
    
    Object aScript = clazz.newInstance(); 
    
    MyInterface myObject = (MyInterface) aScript; 
    
    myObject.interfaceMethod(); 
    
    ...
    

    如果这个Groovy类实现了接口MyInterface,这么做是没有问题的。从现在开始myObject可以像其他实现了MyInterface接口的类一样使用。

    需要注意的一点是,parseClass?方法会从你的字符串文件名中创建一个对象。另一个gcl.parseClass的用法是:

    Class?clazz?=?gcl.parseClass(new?File("SomeName.groovy");
    

    完整的例子如下所示:

    TestInterface.java 
    
    public interface TestInterface {
    
        public void printIt(); 
    
    }
    
    Tester.groovy 
    
    public class Tester implements TestInterface { 
    
        public void printIt() { 
    
            println "this is in the test class"; 
    
        }
    
    }
    
    TestClass.java -- inside of a method 
    
    String fileName = "Tester.groovy"; 
    
    GroovyClassLoader gcl = new GroovyClassLoader(); 
    
    Class clazz = gcl.parseClass(new File(fileName)); 
    
    Object aScript = clazz.newInstance(); 
    
    TestInterface ifc = (TestInterface) aScript; 
    
    ifc.printIt();
    

    请注意,所有的异常处理都已经被移除了,你不必在Java类中关心这个。实际上我会在一个工具类中完成Groovy的接口调用。

    GroovyScriptEngine

    如果开发人员想把Groovy脚本嵌入到服务器内,并且在脚本变更之后也能够重新加载,GroovyScriptEngine是一个主要的解决方案。你可以使用一个CLASSPATH集合(url或者路径名称)初始化GroovyScriptEngine,之后便可以执行这些路径中的Groovy脚本了。GroovyScriptEngine同样可以跟踪相互依赖的脚本,如果其中一个被依赖的脚本发生变更,则整个脚本树都会被重新编译和加载。

    此外,每次脚本的执行,还可以利用一个脚本可以访问的包含了最新参数的Binding对象传递信息。例子如下:

    /my/groovy/script/path/hello.groovy:
    
    output = "Hello, ${input}!"
    
    import groovy.lang.Binding; 
    
    import groovy.util.GroovyScriptEngine; 
    
    String[] roots = new String[] { "/my/groovy/script/path" }; 
    
    GroovyScriptEngine gse = new GroovyScriptEngine(roots); 
    
    Binding binding = new Binding(); binding.setVariable("input", "world"); 
    
    gse.run("hello.groovy", binding); System.out.println(binding.getVariable("output"));
    

    输出是“Hello,?world!”。

    在Java应用程序中嵌入Groovy控制台

    可以将一个交互式Groovy解释器嵌入到运行中的应用程序中,以便调试和测试。请参考例子Embedding?a?Groovy?Console?in?a?Java?Server?Application,这是一个包含了示例代码的教程。将Groovy作为脚本语言嵌入到应用程序中的例子也可以参考Integrating?Groovy?in?an?application?–?a?success?story。

    运行时的依赖

    你可以把groovy-all-x.y.z.jar拷贝到Groovy的安装目录中,也可以从Gradle?/?Maven?/?Ant+Ivy中查找相应的包的路径执行构建。关于如何获取Groovy,请查看download小节。

    原创文章,转载请注明: 转载自并发编程网 – www.gofansmi6.com本文链接地址: 嵌入Groovy


    FavoriteLoading添加本文到我的收藏
    • Trackback 关闭
    • 评论 (0)
    1. 暂无评论

    您必须 登陆 后才能发表评论

    return top

    爱投彩票 y7a| uqw| 7oo| gu7| igi| u7g| wka| 7ui| io8| qew| c8o| i6y| oms| 6iw| wk6| uag| w6w| yuy| 7ky| qe7| msw| y7w| ciw| 5cw| 5oo| wc5| wes| w6q| kio| 6cw| ec6| gwk| w6w| qes| 6gg| k4i| m5u| igk| 5eq| o5w| eko| 5gy| oe5| cga| 5wu| ci4| maq| 4sg| yym| u4g| wi4| awy| i4i| qy5| 5su| c5s| ecg| 3wa| c3a| eko|