gpt4 book ai didi

jruby - 如何告诉 JRuby 重新加载/刷新 Java 类?

转载 作者:行者123 更新时间:2023-12-04 19:53:08 26 4
gpt4 key购买 nike

我正在使用 JRuby 编写 Java 脚本。通过使用 JRebel,我可以自动将更改的 Java 类重新加载到 JRuby JVM 中,而无需重新启动。当我添加一个新的 Java 方法时,JRebel 会自动重新加载该类。我的问题是我不能直接调用这个新方法。我可以要求 JRuby 为新重新加载的 Java 类刷新其方法缓存吗?我唯一的解决方法是使用 java_send 反射性地调用新方法。

例子:

步骤 1. 启动 irb session 并 java_import 一个 Java 类(比如 Person)。

步骤 2. 向 Person 添加 getName 方法并编译。

步骤 3. 创建一个 Person (p = Person.new) 的实例。 JRebel 将显示它重新加载了 java 类。

步骤 4. 调用 p.get_name 导致 NoMethodError 但 p.java_send('getName') 调用新实现的 getName 方法

最佳答案

我找到了一种使用 JRebel 运行 JRuby 的方法!

诀窍是使用 Nailgun 服务器启动 JRuby,该服务器使用 JRebel,如下所示:

jruby --ng-server -J-javaagent:/Applications/ZeroTurnaround/JRebel/jrebel.jar -J-noverify

现在可以使用 Nailgun 启动 rails 应用程序:
jruby --ng -S rails server

如果 rails 从某处使用 Java 类,并且它可以找到正确的 rebel.xml,JRebel 将接收更改,您不再需要重新启动 rails。
$CLASSPATH << "#{RAILS_ROOT}/java/target/classes"

JRuby/JRebel 仍然需要做更多的工作,因为 JRuby 没有处理对类声明的更改,只处理已知方法的内容。

关于jruby - 如何告诉 JRuby 重新加载/刷新 Java 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2999109/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com