Java 在ScriptEngine';环境/背景

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

我可以编写在封闭源代码Java应用程序中运行的脚本。脚本可以访问应用程序的静态API

以下脚本询问静态API鼠标在Java应用程序窗口上的位置:

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代码(正如我在示例中所做的那样)。此外,请修改您的问题与例外跟踪,以防它有任何有用的。