我可以编写在封闭源Java应用程序中运行的脚本。脚本可以访问应用程序的静态API。
以下脚本询问静态API鼠标位于Java App窗口的位置:
public class JavaScript extends Script {
public void run() {
System.out.println(General.getMousePos());
}
}
但是这不起作用(API与NullPointerException崩溃):
public class JavaScript extends Script {
public void run() {
ScriptEngineManager m = new ScriptEngineManager();
ScriptEngine rubyEngine = m.getEngineByName("jruby");
rubyEngine.eval("puts General.getRealMousePos()");
}
}
由于General.respond_to? "getRealMousePos" == true
我认为Ruby代码正在与应用程序未初始化的API的不同实例进行通信。
是否可以将对象从Java传递给Ruby,或者从运行ScriptEngine对象的环境/上下文中调用方法?我只找到了字符串(setContext / setAttrib)
答案 0 :(得分:0)
你的应用程序可能正在做一些非常疯狂的事情,但我把一个快速测试放在一起,似乎表明脚本容器使用相同的静态数据:
<强> COM /测试/ Static.java 强>
package com.test;
public class Static {
private static long init;
static {
init = System.currentTimeMillis();
try {
// If this is run a second time, make sure it's different.
Thread.sleep(1000);
} catch (Exception e) {
// LOL
}
}
public static long getInitTime() {
return init;
}
}
<强> Main.java 强>
import javax.script.*;
public class Main {
public static void main(String args[]) throws Exception {
ScriptEngineManager m = new ScriptEngineManager();
ScriptEngine rubyEngine = m.getEngineByName("jruby");
System.out.println("Java time: " + com.test.Static.getInitTime());
rubyEngine.eval("puts \"Ruby time: #{com.test.Static.init_time}\"");
}
}
以
运行javac -cp . *java com/test/*java
jar -cf static.jar com/
java -cp jruby.jar:. Main
<强>输出强>
Java time: 1388707668166
Ruby time: 1388707668166