分享
 
 
 

Groovy与Java代码间的互操作

王朝java/jsp·作者佚名  2006-01-31
窄屏简体版  字體: |||超大  

1

Groovy互操作说明

Groovy脚本有两种调用方式,一是作为普通脚本文件(.groovy),使用Groovy提供的命令行groovy或者通过类groovy.lang.GroovyShell来调用。二是作为普通的Java类文件(.class),用传统的方式来调用,这需要先使用groovyc把脚本文件编译成类文件,然后再使用java命令来调用。

2

Groovy脚本调用Groovy脚本

2.1

代码:

Test.groovy:

package

org.nick;

class

Test{

Test(){

t = new TestS();

t.a();

}

static void

main(String[] args){

t = new Test();

}

}

TestS.groovy:

package

org.nick;

class

TestS{

void

a(){

println("Hello

World");

}

}

2.2

使用groovy命令:

i.

说明:不可行。由于groovy没有提供指定classpath的参数,因此,当两个groovy脚本需要进行互相调用时,Test.groovy将不能找到他所需要的TestS.groovy的定义,因此,通过groovy命令,不能实现两个脚本间的直接调用。

2.3

使用GroovyShell:

i.

说明:可行。由于GroovyShell是一标准的Java类,因此,我们可以通过指定classpath,来找到所需的类。但这里有一个前提,被调用的脚本需要事先编译为.class文件。

ii.

实例:

<target

name="run" depends="init">

<java

classname="groovy.lang.GroovyShell">

<classpath

refid="run.path"/>

<arg

value="${src.dir}/org/nick/Test.groovy" />

</java>

</target>

注:classpath当中包含了GroovyShell所在的jar,和被调用脚本编译后类文件的目录。

2.4

使用java命令:

i.

说明:可行。由于所有的脚本文件都被编译为了.class文件,因此,我们可以像一般的情况那样,在脚本之间互相调用。

ii.

实例:

<java

classname="org.nick.Test">

<classpath

refid="run.path"/>

</java>

3

Groovy脚本调用Java代码

3.1

代码:

Test.groovy:

package

org.nick;

class

Test{

Test(){

b = new TestJ();

b.a();

}

static void

main(String[] args){

t = new Test();

}

}

TestJ.java:

package org.nick;

public class TestJ {

public

void a(){

System.out.println("Hello");

}

}

3.2

使用groovy命令:

i.

说明:理论不可行。原因同上,由于groovy不能指定其他类所在的位置,所以理论上不可行。但实际上groovy脚本内部是能够调用java.*等包中的Java类的,也就是说只要我们把我们自己写的Java类提前编译了,并放到classpath所指定的位置,我们就能使用groovy命令来实现Groovy脚本调用Java代码。

3.3

使用GroovyShell:

i.

说明:可行。理由同上。只要把Java文件提前编译了即可。

3.4

使用java命令:

i.

说明:可行。理由同上。

4

Java代码调用Groovy脚本

4.1

代码:

Groovy脚本:

package

org.nick;

for(it in

args)

println(it)

Groovy类:

package

org.nick;

class

Test{

void

a(name){

println("Hello

${name}");

}

}

4.2

使用GroovyShell调用Groovy脚本:

i.

说明:通过GroovyShell类,我们可以在Java程序代码中直接加载和运行Groovy脚本。而且,通过Binding类,我们还可以向Groovy脚本传递参数的值。

ii.

代码:

package org.nick;

public class GroovyTest {

public static void

main(String[] args) throws Exception{

Binding binding = new

Binding();

binding.setVariable("args",

new String[]{"aaa","bbb","ccc"});

GroovyShell shell = new

GroovyShell(binding);

Object obj =

shell.evaluate(new File("src/org/nick/Test.groovy"));

}

}

4.3

使用GroovyScriptEngine调用Groovy脚本:

i.

说明:GroovyScriptEngine是比GroovyShell更完整的一个方案,通过roots变量,我们指定了脚本文件所在的目录,然后在需要运行时,GroovyScriptEngine将根据roots中的变量查找并运行指定的脚本文件。同样,我们可以通过Binding类为脚本传入参数。另外,有一点很重要的就是,当我们所调用的脚本调用了另一脚本时,如果使用GroovyShell方式且被调用脚本未编译为Java类,那么将出现ClassNotFound错误,但如果使用GroovyScriptEngine,那么当一脚本调用另一脚本时,即使另一脚本未编译为Java类,但只要他出现在roots变量所指向的位置,GroovyScriptEngine也能找到该对应的脚本。

ii.

代码:

package org.nick;

public class GroovyTest {

public

static void main(String[] args) throws Exception {

String[]

roots = new String[] { "src/org/nick" };

GroovyScriptEngine

gse = new GroovyScriptEngine(roots);

Binding

binding = new Binding();

binding.setVariable("args",

new String[] { "aaa", "bbb", "ccc" });

gse.run("Test.groovy",

binding);

}

}

4.4

使用GroovyClassLoader加载Groovy类:

i.

说明:通过GroovyClassLoader我们可以像在Java代码当中那样,动态加载由Groovy脚本书写的类。并且通过对所装载的类进行实例化,我们可以以一种类似于反射的方式来调用其内部的方法。

ii.

代码:

package org.nick;

public class GroovyTest {

public

GroovyTest() {

try

{

ClassLoader

parent = getClass().getClassLoader();

GroovyClassLoader

loader = new GroovyClassLoader(parent);

Class

groovyClass = loader.parseClass(new File

("src/org/nick/Test.groovy"));

GroovyObject

groovyObject = (GroovyObject)

groovyClass.newInstance();

groovyObject.invokeMethod("a",new

Object[]{"aaa"});

}

catch (Exception e) {

e.printStackTrace();

}

}

public

static void main(String[] args) {

GroovyTest

t = new GroovyTest();

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有