允许Java';s ScriptEngineManager来访问某些Java方法
是否可以从ScriptEngineManager内部访问Java方法 我发现了如何使用Invocable invoke函数方法,但现在我需要相反的方法允许Java';s ScriptEngineManager来访问某些Java方法,java,Java,是否可以从ScriptEngineManager内部访问Java方法 我发现了如何使用Invocable invoke函数方法,但现在我需要相反的方法 public class Main { public static void main (String[] args) throws Exception { String source = "var results = system.foo('example'); \n" +
public class Main {
public static void main (String[] args) throws Exception {
String source = "var results = system.foo('example'); \n" +
" \n" +
"if(results == \"hello\") { \n" +
" print(\"ding dong.\"); \n" +
"} \n";
ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
engine.eval(source);
}
}
public class System {
public static String foo (String x) throws Exception {
// do something with x
return("hello");
}
}
因此,当我运行system.foo时,它应该运行system.foo中的方法。这样做更容易。假设您想向脚本公开系统。out
:
Context cx = Context.enter();
Scriptable scope = cx.initStandardObjects();
Object wrappedOut = Context.javaToJS(System.out, scope);
ScriptableObject.putProperty(scope, "out", wrappedOut);
然后在JavaScript中:
var hello = "Hello World";
out.println(hello);
您还可以通过扩展Rhino库中的函数类来公开各个Java方法,它们以类似的方式将其公开给您的脚本。如果您正在寻找JavaScript引擎,我将使用Rhino的最新版本。随JRE打包的版本很旧。我需要能够指定它们可以访问哪些类。那么这是否意味着并非所有方法都将公开?您可以公开一个对象,也可以通过在Rhino库中实现函数对象来包装一个方法。