javascript - 在Node js中调用Java方法

标签 javascript java node.js

我正在尝试从节点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();


我可能完全错了,但是我试图从node js访问java函数。

最佳答案

这是一个很好的问题。通常,有几种语言互操作方法:


在完全独立的隔离程序/进程中运行代码,并使用进程间通信(IPC)或其他网络协议(TCP或基于TCP的高层协议(例如HTTP),通常使用REST-ful API或某种形式的RPC系统)在使用不同语言编写的两个流程之间发送信息。
将一种语言“转换”为另一种语言(例如,使用JSweet或TeaVM编译器将Java代码转换为JavaScript代码),然后用一种语言的原始代码以及另一种语言的转换代码创建单个应用程序/流程(现在与最终应用程序中内置的其他代码使用相同的语言)。
使用公共中间语言和允许代码进行互操作的低级“本机”接口。大多数语言与C都有某种形式的互操作(因为C是大多数操作系统支持的公分母)。尽管这不适用于客户端JavaScript(尽管某些原则仍与Native Client(NaCL)相关),但对于NodeJ,您可以使用node-gypcwrap调用C代码。一旦进入C领域,就可以使用Java Native Interface (JNI)调用Java(尽管可以通过使用SWIG为您自动生成很多样板代码来更轻松地使用JNI从C调用Java代码)。 ,而不是直接写入JNI规范)。


与所有事物一样,各种方法也需要权衡:


方法1:


优点:


相对简单
适用于几乎所有编程语言
每个子系统彼此完全隔离
每个系统都可以以惯用的语言进行调试

缺点:


必须定义共享协议


可能导致冗余的重复代码
协议必须保持同步
更改必须向后兼容,否则将中断
注意:protocol buffers可以帮助您

序列化/反序列化开销
通道可能会增加其他开销(例如,如果通过Internet而不是通过UNIX域套接字在同一台计算机上在进程之间进行通信)
必须考虑通讯机制的安全性


子系统之间的数据加密
端点的访问控制



方法2:


优点:


没有序列化/反序列化开销
可以使用针对目标语言的惯用法来调试最终系统

缺点:


并非所有语言都可以从一种语言转换为另一种语言
即使编译器支持两种语言:


通常只支持部分语言
可能需要修复/修改代码才能进行翻译
可能需要修复/修改转储器
移植中的语义略有不同会导致细微,令人惊讶的错误

子系统之间没有隔离


方法3:


优点:


没有序列化/反序列化开销
比方法2更多的支持
无需用任何一种语言重写原始代码

缺点:


必须成为SWIG等深奥工具的专家
结果很难调试


NodeJS代码的堆栈跟踪突然包含C,JVM,Java代码
调试工具无法轻松跨越各种语言(例如,最终可能会逐步通过JVM代码解释Java,而不是逐步通过实际的Java代码)

如果没有正确编码所有权语义,则对象所有权,跨语言的垃圾回收会导致令人惊讶的/难以处理的错误
语言之间的不同线程模型或语言之间的其他语义不匹配会导致整个系统出现故障/难以调试




在使用带有方法1和方法3的系统(以及使用方法2的系统的经验)之后,我强烈建议尽可能使用方法1。只有当您发现序列化开销不合理(并且您无法优化通信协议/机制来处理该问题)时,我才会冒险进入其他领域。话虽如此,如果语言非常相似(例如从TypeScript到JavaScript的翻译),则方法2可以成功;如果使用这种机制的范围非常有限(例如,只需要公开一种语言),则方法3可以成功。小但经常被称为/对性能敏感的函数)。

关于javascript - 在Node js中调用Java方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56234313/

相关文章:

javascript - 正则表达式查找最后一个不包含数字的字符串

javascript - 如何使用 'new' 从另一个函数/对象中的函数创建对象

java - Java 的 toLowerCase() 是否保留原始字符串长度?

java - 为什么可以将 java 可为空的返回值分配给 Kotlin Non-Nullable 变量?

node.js - findOneAndUpdate() 在 upsert 上返回 null 值

node.js - WebStorm NPM 调试配置中的 `Connection refused`

node.js - 运行npm时设置 Node 参数

javascript - 在字典中存储函数 [Python]

Java 文件处理,我做错了什么?

javascript - 通过 Google Spreadsheet API 导入 JSON