我试图从节点js调用java中定义的函数。
示例:
public class A{
public void show(){
System.out.prntln("Invoked from Node JS");
}
}
和节点js文件
console.log("In Node JS");
//define calling A like A a = new A();
a.show();
我可能完全错了,但我试图从节点js访问java函数。
答案 0 :(得分:8)
这是一个很好的问题。一般来说,语言互操作有几种方法:
在完全独立,隔离的程序/进程中运行代码,并使用进程间通信(IPC)或其他网络协议(基于TCP的TCP或更高级别协议,如HTTP,通常使用REST-ful API,或者某种形式的RPC系统)在用不同语言编写的两个进程之间发送信息。
将一种语言“透明化”到另一种语言中(例如,使用JSweet或TeaVM转换器将Java代码转换为JavaScript代码),然后使用一种语言与原始代码一起创建单个应用程序/进程来自其他语言的转换代码(现在与最终应用程序中构建的其他代码使用相同的语言)。
使用通用的中间语言和低级“本机”接口,允许代码进行互操作。大多数语言都与C进行某种形式的互操作(因为C是大多数操作系统支持的共同标准)。虽然这不适用于客户端JavaScript(尽管一些原则仍与Native Client(NaCL)相关),但使用NodeJ,您可以使用node-gyp和cwrap调用C代码。一旦你进入C land,就可以使用Java Native Interface (JNI)调用Java(虽然可以通过让SWIG自动生成大部分样板来更容易地使用JNI从C调用Java代码为此而不是直接写入JNI规范。
与所有事情一样,各种方法都存在权衡:
使用方法#1和方法#3的系统(以及使用方法#2的系统听证会),我强烈建议尽可能使用方法#1;只有当你发现序列化开销难以维持(并且你无法优化通信协议/机制来处理这个问题)时,我才会冒险进入其他领域。话虽如此,如果语言非常相似(如从TypeScript到JavaScript的转换),方法#2可以成功,如果使用这种机制的范围非常有限(例如只需暴露一个),方法#3就可以成功这种方式很小但经常被称为/性能敏感的功能。)
答案 1 :(得分:0)
答案 2 :(得分:0)
如果您的方法是public static void main
,则可以使用node-java-caller