Go调用Java的一个简单例子

原创
2012/06/26 11:15
阅读数 2W

由于Java世界里有非常丰富的开源应用模型和轮子,而这些正是Go世界里面最缺乏的东西,所以我首先考虑的就是如何在Go里面调用现有的Java代码。早上写了个简单的Go调用Java的例子,在winxp环境下能够正常运行。这段代码比较简单,就是在Go代码里面去call一个叫Hello的java对象。而这个Hello .java功能也非常简单,就是接收一个参数,然后输出一行结果。
调用的初始感觉还行,当然还需要后面做更复杂的案例测试。具体的代码如下:

// run_java

package main

 

import (

"fmt"

"os/exec"

)

 

/**

* 调用一个Hello.class,并接收一个参数

*/

func callJava(){

cmd := exec.Command("java","Hello","tom")

out,err := cmd.Output()

if err != nil {

println("error:",err.Error())

}

fmt.Printf("call java class Hello: %q\n", string(out))

 

}

func main() {

fmt.Println("Test Call Java function!")

callJava()

}

 

/* Hello.java

public class Hello{

public static void main(String[] args){

if(args.length==0)

System.out.println("hello my world!");

else

System.out.println("hello my world! "+args[0]);

}

}*/

注意:
为了能够运行我的例子,需要把Hello.class放在和 run_java的可执行文件同样的目录下。例如, run_java.exe在d:\goproject下,那么Hello.class也要在d:\goproject下。

-------------------------------------------------
2012-07-03

找到一款开源的GoJVM框架,可以在Go程序里面实例化一个java class,并调用 java class 里面的方法。 老外真是牛, GoJVM 正是我想要的东西。有些遗憾的是GoJVM目前支持比较简单的JAVA对象,而且已经有快一年没有更新了。感兴趣的朋友可以自己去下载学习一下。

--------------------------------------

2012-07-04

看来有些人还是没看懂程序,那我就给没看懂程序的朋友再讲解一下吧。写这个例子是为了探索Go调用Java代码的可行方式。而这个例子是演示了在同一个进程内,Go程序如何与Java程序完成信息交换的。首先,在同一个进程里,Go程序启动JVM,并加载Java程序Hello.class,并发送参数“tom”,Java程序Hello.class在接收到消息后,完成运算后通过控制台向Go程序返回结果,然后Go程序把返回结果打印出来。这种Go 在同一个进程内调用Java程序是最简单、最容易实现的方式。

展开阅读全文
打赏
0
11 收藏
分享
加载中
你好,我每次Go语言执行到调用java的时候就这个错误,你看看
2013/07/29 11:54:29 error: exit status 1
2013/07/29 11:54:29 call java class Hello: ""
2013/07/29 13:35
回复
举报
怎么不用classloader
2012/10/02 21:44
回复
举报
你这个不是通过命令行来调用吗?
2012/08/27 23:48
回复
举报

引用来自“qinhui99”的评论

引用来自“cbh”的评论

。。。这叫跨语言调用??晕死人

真怀疑你有没看懂程序。写这个例子是为了探索Go调用Java代码的可行方式。而这个是演示了在同一个进程内,Go程序与Java程序完成了信息交换。Go程序想向Java程序放松消息,Java程序在接收到消息后,完成运算后通过控制台向Go程序返回结果,然后Go程序把返回结果打印出来。

呃,我知道你说的同进程的意思了。。我只能说。。晕
2012/07/04 21:18
回复
举报

引用来自“qinhui99”的评论

引用来自“cbh”的评论

。。。这叫跨语言调用??晕死人

真怀疑你有没看懂程序。写这个例子是为了探索Go调用Java代码的可行方式。而这个是演示了在同一个进程内,Go程序与Java程序完成了信息交换。Go程序想向Java程序放松消息,Java程序在接收到消息后,完成运算后通过控制台向Go程序返回结果,然后Go程序把返回结果打印出来。

好吧,os/exec。。真看不出是同进程 ,于是我去查了下

Package exec

import "os/exec"
Overview
Index
Examples
Overview ▾

Package exec runs external commands. It wraps os.StartProcess to make it easier to remap stdin and stdout, connect I/O with pipes, and do other adjustments.


。。。真的不是同进程调用
2012/07/04 21:16
回复
举报
qinhui99博主

引用来自“cbh”的评论

。。。这叫跨语言调用??晕死人

真怀疑你有没看懂程序。写这个例子是为了探索Go调用Java代码的可行方式。而这个是演示了在同一个进程内,Go程序与Java程序完成了信息交换。Go程序想向Java程序放松消息,Java程序在接收到消息后,完成运算后通过控制台向Go程序返回结果,然后Go程序把返回结果打印出来。
2012/07/04 14:51
回复
举报
。。。这叫跨语言调用??晕死人
2012/07/04 11:11
回复
举报
qinhui99博主

引用来自“答复哈”的评论

我还以为直接调用java类了`

你可以去研究GoJVM看看,也许符合你的需求。
2012/07/03 18:50
回复
举报
我还以为直接调用java类了`
2012/07/03 16:44
回复
举报
qinhui99博主
准确的说,我这的返回结果应该是java代码往控制台输出的信息。
2012/06/26 17:31
回复
举报
更多评论
打赏
12 评论
11 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部