Groovy全攻略--嵌入篇
生活随笔
收集整理的這篇文章主要介紹了
Groovy全攻略--嵌入篇
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Groovy被設計得非常輕量級,很容易遷入到任何Java應用系統。
你可以使用BSF將Groovy腳本嵌入任何Java代碼中.但是Groovy提供了一個輕量級的緊密集成.下面是3種主要方法:
1.使用Shell調試腳本或表達式
在Groovy中你可以使用GroovyShell對Groovy腳本和表達式進行調試.GroovyShell允許你通過Binding對象傳入或傳出變量.
//?從Java代碼中調用Groovy語句
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));
2.在Java中動態調用運行Groovy代碼
你可以使用GroovyClassLoader將Groovy的類動態地載入到Java程序中并直接使用或運行它.
下面是一個例子:
ClassLoader?parent?=?getClass().getClassLoader();
GroovyClassLoader?loader?=?new?GroovyClassLoader(parent);
Class?groovyClass?=?loader.parseClass(new?File("src/test/groovy/script/HelloWorld.groovy"));
//?調用實例中的某個方法
GroovyObject?groovyObject?=?(GroovyObject)?groovyClass.newInstance();
Object[]?args?=?{};
groovyObject.invokeMethod("run",?args);
如果你想使用一個用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接口的Java對象一樣.
3.Groovy腳本引擎
對于那些想將Groovy腳本嵌入到服務器并且在每次修改后重新裝入的人來說,Groovy腳本引擎提供了一個徹底的解決方案.你可以設定系列CLASSPATH作為根來初始化Groovy腳本引擎,這些GLASSPATH可以是URL也可以是目錄名.接著你就可以這些根路徑下的任何Groovy腳本了.GSE會跟蹤腳本間的依賴關系,因此如果任何有依賴關系的腳本被修改,整顆樹將會重新編譯和載入.
另外,每次執行腳本時,你都可以傳入一個包含腳本可接受屬性的Binding.腳本執行完以后,傳入腳本中的那些屬性在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( " test.groovy " ,?binding);
System.out.println(binding.getVariable( " output " )); 將打印 "Hello, world!".
4.運行時依賴
和JDK1.4一樣,Groovy Jar也依賴與ASM庫上的運行時,ASM庫包括4個Jar(asm-2.1.jar, asm-util-2.1.jar, asm-attrs-2.1.jar and asm-analysis-2.1). 也就是說,只要將上面的5個Jar添加到路徑中,你就能將輕松地Groovy嵌入到你的應用里.
另一種方案可以不用那么多的Jar.你可以用GROOVY_HOME/embeddable目錄下的groovy-all-1.0-beta-x.jar.這個Jar包將Groovy和ASM組合打包成一個方便的Jar包.注意:groovy-all-1.0-beta-x.jar中的ASM類使用了不同的命名空間,因此要避免與使用ASM的庫發生沖突.
你可以使用BSF將Groovy腳本嵌入任何Java代碼中.但是Groovy提供了一個輕量級的緊密集成.下面是3種主要方法:
1.使用Shell調試腳本或表達式
在Groovy中你可以使用GroovyShell對Groovy腳本和表達式進行調試.GroovyShell允許你通過Binding對象傳入或傳出變量.
//?從Java代碼中調用Groovy語句
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));
2.在Java中動態調用運行Groovy代碼
你可以使用GroovyClassLoader將Groovy的類動態地載入到Java程序中并直接使用或運行它.
下面是一個例子:
ClassLoader?parent?=?getClass().getClassLoader();
GroovyClassLoader?loader?=?new?GroovyClassLoader(parent);
Class?groovyClass?=?loader.parseClass(new?File("src/test/groovy/script/HelloWorld.groovy"));
//?調用實例中的某個方法
GroovyObject?groovyObject?=?(GroovyObject)?groovyClass.newInstance();
Object[]?args?=?{};
groovyObject.invokeMethod("run",?args);
如果你想使用一個用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接口的Java對象一樣.
3.Groovy腳本引擎
對于那些想將Groovy腳本嵌入到服務器并且在每次修改后重新裝入的人來說,Groovy腳本引擎提供了一個徹底的解決方案.你可以設定系列CLASSPATH作為根來初始化Groovy腳本引擎,這些GLASSPATH可以是URL也可以是目錄名.接著你就可以這些根路徑下的任何Groovy腳本了.GSE會跟蹤腳本間的依賴關系,因此如果任何有依賴關系的腳本被修改,整顆樹將會重新編譯和載入.
另外,每次執行腳本時,你都可以傳入一個包含腳本可接受屬性的Binding.腳本執行完以后,傳入腳本中的那些屬性在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( " test.groovy " ,?binding);
System.out.println(binding.getVariable( " output " )); 將打印 "Hello, world!".
4.運行時依賴
和JDK1.4一樣,Groovy Jar也依賴與ASM庫上的運行時,ASM庫包括4個Jar(asm-2.1.jar, asm-util-2.1.jar, asm-attrs-2.1.jar and asm-analysis-2.1). 也就是說,只要將上面的5個Jar添加到路徑中,你就能將輕松地Groovy嵌入到你的應用里.
另一種方案可以不用那么多的Jar.你可以用GROOVY_HOME/embeddable目錄下的groovy-all-1.0-beta-x.jar.這個Jar包將Groovy和ASM組合打包成一個方便的Jar包.注意:groovy-all-1.0-beta-x.jar中的ASM類使用了不同的命名空間,因此要避免與使用ASM的庫發生沖突.
總結
以上是生活随笔為你收集整理的Groovy全攻略--嵌入篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于Jeecg互联网化dubbo改造方案
- 下一篇: hdu 5067(状态压缩dp)