我希望能夠通過put()
將對象傳遞到ScriptEngine
,並且能夠從腳本引擎內訪問其屬性和方法。如果我將其中一個類的對象綁定到腳本引擎,那麼如何使用腳本引擎作爲該類的對象來訪問它?
e.g
public class MyClass {
String getName() { return "abc"; }
}
MyClass my = new MyClass();
engine.put("abc", my);
我怎樣才能做到這一點?
我希望能夠通過put()
將對象傳遞到ScriptEngine
,並且能夠從腳本引擎內訪問其屬性和方法。如果我將其中一個類的對象綁定到腳本引擎,那麼如何使用腳本引擎作爲該類的對象來訪問它?
e.g
public class MyClass {
String getName() { return "abc"; }
}
MyClass my = new MyClass();
engine.put("abc", my);
我怎樣才能做到這一點?
這裏是一個完整的工作示例JavaScript
。正如我在評論中提到的,你必須確保你的方法是public
。
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
public class JavaScriptEngineSample {
public static class MyClass {
private String name;
public String getName() { return name; }
public void setName(final String name) { this.name = name; }
}
public static void main(final String[] args) throws ScriptException {
final MyClass my = new MyClass();
my.setName("Input");
final ScriptEngineManager factory = new ScriptEngineManager();
// you could also use 'javascript' here, I'm using 'nashorn' to visualize that I'm using the new Java 8 Engine
final ScriptEngine engine = factory.getEngineByName("nashorn");
engine.put("my", my);
String script = "java.lang.System.out.println(my.getName());";
script += "my.setName('Output');";
engine.eval(script);
System.out.println(my.getName());
}
}
謝謝,它的工作原理..然後,我刪除靜態和移動MyClass到另一個包在同一個項目。我得到一個ClassNotFoundException ...我想知道什麼我需要這樣做,以便ScriptEngine知道在哪裏找到類 - 我認爲這可能是我的真實項目中的問題的根源,即使異常或錯誤消息不是'ClassNotFoundException'那裏 – ycomp
這是正常的不是問題,只要班級是公開的,並且可以在班級路線上找到爲了簡單起見,將它保存在一個文件中。你能發表一個沒有運行的例子嗎? – Philipp
這裏是該項目的屏幕截圖..忽略其他背景選項卡..https://ibb.co/fPaNbF – ycomp
首先,我猜你忘了'new' for'new MyClass()'?如果有,可以輕鬆訪問該對象,這取決於您使用的引擎。我在我的問題中有一個例子:http://stackoverflow.com/questions/42338239/access-variable-of-scriptcontext-using-nashorn-javascript-engine-java-8 - 也許這有助於。我使用上下文雖然... – Philipp
@ Philipp抱歉,我一直在Java和Kotlin之間切換(Kotlin沒有'new') – ycomp
@Philipp訪問不是問題,但我無法弄清楚如何投。我正在使用groovy和JavaScript。 – ycomp