草庐IT

javascript - 在 Node js 中调用 java 方法

coder 2024-03-12 原文

这个问题在这里已经有了答案:





Call java program from Node.js application

(5 个回答)


9 个月前关闭。




我正在尝试从 node js 调用在 java 中定义的函数。

示例:

public class A{
 public void show(){
   System.out.prntln("Invoked from Node JS");
 }
}

和一个 Node js文件
console.log("In Node JS");
//define calling A like A a = new A();
a.show();

我可能完全错了,但我正在尝试从 node js 访问 java 函数。

最佳答案

这是一个很好的问题。一般来说,语言互操作有以下几种方式:

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

  • 与所有事情一样,各种方法也需要权衡:
  • 方法#1:
  • 优点:
  • 相对直接
  • 几乎适用于任何编程语言
  • 每个子系统彼此完全隔离
  • 每个系统都可以用语言惯用的方式调试
  • 缺点:
  • 必须定义共享协议(protocol)
  • 可能导致冗余、重复的代码
  • 协议(protocol)必须保持同步
  • 更改必须向后兼容,否则会破坏
  • 注意:protocol buffers可以帮助解决这个问题
  • 序列化/反序列化开销
  • channel 可以增加其他开销(例如,如果进程之间通过 Internet 进行通信,而不是通过 UNIX 域套接字在同一台机器上进行通信)
  • 必须考虑通信机制的安全性
  • 子系统之间的数据加密
  • 端点的访问控制
  • 方法#2:
  • 优点:
  • 没有序列化/反序列化开销
  • 可以使用目标语言的习语调试最终系统
  • 缺点:
  • 并非所有语言都可以从一种语言转换为另一种语言
  • 即使转译器支持两种语言:
  • 通常只支持语言的一个子集
  • 可能需要修复/修改代码以允许它转译
  • 可能需要修复/修改转译器
  • 转译中略有不同的语义会导致微妙的、令人惊讶的错误
  • 子系统之间没有隔离
  • 方法#3:
  • 优点:
  • 没有序列化/反序列化开销
  • 比方法#2 更多的支持
  • 无需用任何一种语言重写原始代码
  • 缺点:
  • 必须成为 SWIG 等深奥工具的专家
  • 结果很难调试
  • NodeJS 代码的堆栈跟踪突然包含 C、JVM、Java 代码
  • 调试工具不容易跨语言(例如可能最终单步执行解释 Java 的 JVM 代码,而不是单步执行实际的 Java 代码)
  • 对象所有权,如果所有权语义未正确编码,跨语言垃圾收集可能会导致令人惊讶/难以处理的错误
  • 语言之间的不同线程模型或语言之间的其他语义不匹配会使整个系统出错/难以调试

  • 使用过方法#1 和方法#3 的系统(以及使用方法#2 的系统听说过),我强烈建议尽可能使用方法#1;只有当您发现序列化开销站不住脚(并且您无法优化通信协议(protocol)/机制来处理该问题)时,我才会冒险进入其他领域。话虽如此,如果语言非常相似(比如从 TypeScript 到 JavaScript 的转换),方法 #2 可以成功,如果这种机制的使用范围非常有限(例如只需要公开一个小但经常调用/性能敏感的功能,以这种方式)。

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

    有关javascript - 在 Node js 中调用 java 方法的更多相关文章

    1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

      我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

    2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

      总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

    3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

      类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

    4. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

      我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

    5. Ruby 方法() 方法 - 2

      我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby​​-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco

    6. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

      我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

    7. ruby - Highline 询问方法不会使用同一行 - 2

      设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

    8. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

      我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

    9. ruby - 多个属性的 update_column 方法 - 2

      我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2

    10. ruby - 检查方法参数的类型 - 2

      我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

    随机推荐