在ScriptEngine的环境/上下文中调用静态Java方法

时间:2014-01-02 13:15:07

标签: java jruby

我可以编写在封闭源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)

1 个答案:

答案 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