Java 在ScriptEngine';环境/背景
我可以编写在封闭源代码Java应用程序中运行的脚本。脚本可以访问应用程序的静态API 以下脚本询问静态API鼠标在Java应用程序窗口上的位置:Java 在ScriptEngine';环境/背景,java,jruby,Java,Jruby,我可以编写在封闭源代码Java应用程序中运行的脚本。脚本可以访问应用程序的静态API 以下脚本询问静态API鼠标在Java应用程序窗口上的位置: public class JavaScript extends Script { public void run() { System.out.println(General.getMousePos()); } } 但是,这不起作用(API因NullPointerException崩溃): 因为General.resp
public class JavaScript extends Script {
public void run() {
System.out.println(General.getMousePos());
}
}
但是,这不起作用(API因NullPointerException崩溃):
因为General.response\u?“getRealMousePos”==true
我认为Ruby代码正在与应用程序未初始化的API的不同实例进行对话
是否可以将对象从Java传递到Ruby,或者从运行ScriptEngine对象的环境/上下文调用方法?我只找到字符串(setContext/setAttrib)您的应用程序可能正在做一些非常疯狂的事情,但我做了一个快速测试,它似乎显示脚本容器使用相同的静态数据: com/test/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;
}
}
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}\"");
}
}
Main.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;
}
}
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
这实际上适用于API的“通用”类,但遗憾的是并非全部。我不明白你的意思。。。什么是有效的,什么是无效的(它是如何失败的,等等)?API编写得很糟糕,有些类是静态的,有些只是最终的,等等。。。我通过将类强制转换为“Class”和“Method”对象,然后通过context.setAttribute方法将它们传递给JRuby,从而获得了所需的类。我注意到,在Java中使用
getMousePos
,而在Ruby中使用getRealMousePos
。您是否可以让它们匹配起来,并在Ruby代码之前立即运行Java代码(正如我在示例中所做的那样)。此外,请修改您的问题与例外跟踪,以防它有任何有用的。