java 结合groovy,Groovy教程:Groovy和Java的相互调用及简单对比

目录:

程序清单

Groovy运行HelloGroovy

Java运行HelloJava

Java运行HelloGroovy

字节码

[一]、程序清单

Groovy代码:HelloGroovy.groovy

println "Hello Groovy welcome to www.micmiu.com"

1

println"Hello Groovy welcome to www.micmiu.com"

Java代码:HelloJava.java

public class HelloJava {

/**

* @param args

*/

public static void main(String[] args) {

System.out.println("Hello Java welcome to www.micmiu.com");

}

}

1

2

3

4

5

6

7

8

9

10

11

publicclassHelloJava{

/**

* @param args

*/

publicstaticvoidmain(String[]args){

System.out.println("Hello Java welcome to www.micmiu.com");

}

}

[二]、Groovy运行HelloGroovy

按win+R键 输入cmd 回车进入dos控制台界面,执行如下命令:

D:\test\groovy>groovy HelloGroovy.groovy

Hello Groovy welcome to www.micmiu.com

D:\test\groovy>groovy HelloGroovy

Hello Groovy welcome to www.micmiu.com

1

2

3

4

5

D:\test\groovy>groovyHelloGroovy.groovy

HelloGroovywelcometowww.micmiu.com

D:\test\groovy>groovyHelloGroovy

HelloGroovywelcometowww.micmiu.com

[三]、Java运行HelloJava

在控制台界面中执行如下命令:

D:\test\groovy>javac HelloJava.java

D:\test\groovy>java HelloJava

Hello Java welcome to www.micmiu.com

1

2

3

4

D:\test\groovy>javacHelloJava.java

D:\test\groovy>javaHelloJava

HelloJavawelcometowww.micmiu.com

[四]、Java运行HelloGroovy

用groovyc 编译 HelloGroovy.groovy源文件:

D:\test\groovy>groovyc HelloGroovy.groovy

D:\test\groovy>tree /F

卷 work 的文件夹 PATH 列表

卷序列号为 2AF7-9BD9

D:.

HelloGroovy.class

HelloGroovy.groovy

HelloJava.class

HelloJava.java

没有子文件夹

1

2

3

4

5

6

7

8

9

10

11

12

D:\test\groovy>groovycHelloGroovy.groovy

D:\test\groovy>tree/F

卷work的文件夹PATH列表

卷序列号为2AF7-9BD9

D:.

HelloGroovy.class

HelloGroovy.groovy

HelloJava.class

HelloJava.java

没有子文件夹

运用java 执行编译后的类:HelloGroovy.class:

D:\test\groovy>java HelloGroovy

Exception in thread "main" java.lang.NoClassDefFoundError: groovy/lang/Script

at java.lang.ClassLoader.defineClass1(Native Method)

at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)

at java.lang.ClassLoader.defineClass(ClassLoader.java:616)

at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:14

1)

at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)

at java.net.URLClassLoader.access$000(URLClassLoader.java:58)

at java.net.URLClassLoader$1.run(URLClassLoader.java:197)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:190)

at java.lang.ClassLoader.loadClass(ClassLoader.java:307)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

at java.lang.ClassLoader.loadClass(ClassLoader.java:248)

Caused by: java.lang.ClassNotFoundException: groovy.lang.Script

at java.net.URLClassLoader$1.run(URLClassLoader.java:202)

at java.security.AccessController.doPrivileged(Native Method)

at java.net.URLClassLoader.findClass(URLClassLoader.java:190)

at java.lang.ClassLoader.loadClass(ClassLoader.java:307)

at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

at java.lang.ClassLoader.loadClass(ClassLoader.java:248)

... 12 more

Could not find the main class: HelloGroovy. Program will exit.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

D:\test\groovy>javaHelloGroovy

Exceptioninthread"main"java.lang.NoClassDefFoundError:groovy/lang/Script

atjava.lang.ClassLoader.defineClass1(NativeMethod)

atjava.lang.ClassLoader.defineClassCond(ClassLoader.java:632)

atjava.lang.ClassLoader.defineClass(ClassLoader.java:616)

atjava.security.SecureClassLoader.defineClass(SecureClassLoader.java:14

1)

atjava.net.URLClassLoader.defineClass(URLClassLoader.java:283)

atjava.net.URLClassLoader.access$000(URLClassLoader.java:58)

atjava.net.URLClassLoader$1.run(URLClassLoader.java:197)

atjava.security.AccessController.doPrivileged(NativeMethod)

atjava.net.URLClassLoader.findClass(URLClassLoader.java:190)

atjava.lang.ClassLoader.loadClass(ClassLoader.java:307)

atsun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

atjava.lang.ClassLoader.loadClass(ClassLoader.java:248)

Causedby:java.lang.ClassNotFoundException:groovy.lang.Script

atjava.net.URLClassLoader$1.run(URLClassLoader.java:202)

atjava.security.AccessController.doPrivileged(NativeMethod)

atjava.net.URLClassLoader.findClass(URLClassLoader.java:190)

atjava.lang.ClassLoader.loadClass(ClassLoader.java:307)

atsun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)

atjava.lang.ClassLoader.loadClass(ClassLoader.java:248)

...12more

Couldnotfindthemainclass:HelloGroovy.Programwillexit.

这样直接运行会出错,是因为没有把 Groovy 相关的jar包添加到Java的CLASSPATH中,执行如下命令即可正确运行:

D:\test\groovy>java -cp .;%GROOVY_HOME%\embeddable\groovy-all-2.0.1.jar HelloGroovy

Hello Groovy welcome to www.micmiu.com

1

2

D:\test\groovy>java-cp.;%GROOVY_HOME%\embeddable\groovy-all-2.0.1.jarHelloGroovy

HelloGroovywelcometowww.micmiu.com

这样Java就可以正常的运行Groovy的程序了。

[五]、字节码

运用javap 查看编译后类文件的字节码信息:

HelloJava.class:

D:\test\groovy>javap HelloJava

Compiled from "HelloJava.java"

public class HelloJava extends java.lang.Object{

public HelloJava();

public static void main(java.lang.String[]);

}

1

2

3

4

5

6

D:\test\groovy>javapHelloJava

Compiledfrom"HelloJava.java"

publicclassHelloJavaextendsjava.lang.Object{

publicHelloJava();

publicstaticvoidmain(java.lang.String[]);

}

HelloGroovy.class:

D:\test\groovy>javap HelloGroovy

Compiled from "HelloGroovy.groovy"

public class HelloGroovy extends groovy.lang.Script{

public static transient boolean __$stMC;

public static long __timeStamp;

public static long __timeStamp__239_neverHappen1343966577689;

public HelloGroovy();

public HelloGroovy(groovy.lang.Binding);

public static void main(java.lang.String[]);

public java.lang.Object run();

public java.lang.Object this$dist$invoke$3(java.lang.String, java.lang.Objec

t);

public void this$dist$set$3(java.lang.String, java.lang.Object);

public java.lang.Object this$dist$get$3(java.lang.String);

protected groovy.lang.MetaClass $getStaticMetaClass();

public static void __$swapInit();

static {};

public java.lang.Object super$3$getProperty(java.lang.String);

public java.lang.String super$1$toString();

public void super$3$setProperty(java.lang.String, java.lang.Object);

public void super$1$notify();

public void super$3$println();

public void super$1$notifyAll();

public void super$3$print(java.lang.Object);

public void super$3$printf(java.lang.String, java.lang.Object[]);

public java.lang.Object super$1$clone();

public java.lang.Object super$3$evaluate(java.lang.String);

public void super$1$wait();

public groovy.lang.MetaClass super$2$getMetaClass();

public void super$1$wait(long, int);

public void super$2$setMetaClass(groovy.lang.MetaClass);

public java.lang.Class super$1$getClass();

public groovy.lang.Binding super$3$getBinding();

public void super$1$finalize();

public void super$3$printf(java.lang.String, java.lang.Object);

public void super$3$setBinding(groovy.lang.Binding);

public void super$1$wait(long);

public void super$3$run(java.io.File, java.lang.String[]);

public java.lang.Object super$3$evaluate(java.io.File);

public void super$3$println(java.lang.Object);

public boolean super$1$equals(java.lang.Object);

public java.lang.Object super$3$invokeMethod(java.lang.String, java.lang.Obj

ect);

public int super$1$hashCode();

static java.lang.Class class$(java.lang.String);

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

D:\test\groovy>javapHelloGroovy

Compiledfrom"HelloGroovy.groovy"

publicclassHelloGroovyextendsgroovy.lang.Script{

publicstatictransientboolean__$stMC;

publicstaticlong__timeStamp;

publicstaticlong__timeStamp__239_neverHappen1343966577689;

publicHelloGroovy();

publicHelloGroovy(groovy.lang.Binding);

publicstaticvoidmain(java.lang.String[]);

publicjava.lang.Objectrun();

publicjava.lang.Objectthis$dist$invoke$3(java.lang.String,java.lang.Objec

t);

publicvoidthis$dist$set$3(java.lang.String,java.lang.Object);

publicjava.lang.Objectthis$dist$get$3(java.lang.String);

protectedgroovy.lang.MetaClass$getStaticMetaClass();

publicstaticvoid__$swapInit();

static{};

publicjava.lang.Objectsuper$3$getProperty(java.lang.String);

publicjava.lang.Stringsuper$1$toString();

publicvoidsuper$3$setProperty(java.lang.String,java.lang.Object);

publicvoidsuper$1$notify();

publicvoidsuper$3$println();

publicvoidsuper$1$notifyAll();

publicvoidsuper$3$print(java.lang.Object);

publicvoidsuper$3$printf(java.lang.String,java.lang.Object[]);

publicjava.lang.Objectsuper$1$clone();

publicjava.lang.Objectsuper$3$evaluate(java.lang.String);

publicvoidsuper$1$wait();

publicgroovy.lang.MetaClasssuper$2$getMetaClass();

publicvoidsuper$1$wait(long,int);

publicvoidsuper$2$setMetaClass(groovy.lang.MetaClass);

publicjava.lang.Classsuper$1$getClass();

publicgroovy.lang.Bindingsuper$3$getBinding();

publicvoidsuper$1$finalize();

publicvoidsuper$3$printf(java.lang.String,java.lang.Object);

publicvoidsuper$3$setBinding(groovy.lang.Binding);

publicvoidsuper$1$wait(long);

publicvoidsuper$3$run(java.io.File,java.lang.String[]);

publicjava.lang.Objectsuper$3$evaluate(java.io.File);

publicvoidsuper$3$println(java.lang.Object);

publicbooleansuper$1$equals(java.lang.Object);

publicjava.lang.Objectsuper$3$invokeMethod(java.lang.String,java.lang.Obj

ect);

publicintsuper$1$hashCode();

staticjava.lang.Classclass$(java.lang.String);

}

从字节码中可以看出主要的main方法是一样的:

public static void main(java.lang.String[]);

1

publicstaticvoidmain(java.lang.String[]);

只是区别在:extends java.lang.Object 或提供的类extends groovy.lang.Script,而这些区别对于一位coder来说是透明的,无需显式注明。

到此本文讲解基本结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值