Java 如果我将某个类的对象绑定到脚本引擎,如何使用脚本引擎将其作为该类的对象访问?
我希望能够通过Java 如果我将某个类的对象绑定到脚本引擎,如何使用脚本引擎将其作为该类的对象访问?,java,scripting,java-scripting-engine,Java,Scripting,Java Scripting Engine,我希望能够通过put()将对象传递到ScriptEngine,并能够从脚本引擎中访问其属性和方法 e、 g 我如何才能做到这一点?这里是一个使用JavaScript的完整工作示例。正如我在评论中提到的,您必须确保您的方法是公开的 import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class JavaScrip
put()
将对象传递到ScriptEngine
,并能够从脚本引擎中访问其属性和方法
e、 g
我如何才能做到这一点?这里是一个使用
JavaScript
的完整工作示例。正如我在评论中提到的,您必须确保您的方法是公开的
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());
}
}
首先,我想你忘记了
newmyclass()
的new
?如果您有,您可以很容易地访问对象,访问方式取决于您使用的引擎。我的问题中有一个例子:-也许这会有帮助。不过我使用的是上下文…@Philipp抱歉,我整天都在Java和Kotlin之间切换(Kotlin没有新的)@Philipp访问不是问题,但我不知道如何转换。我使用的是groovy和javascript,你有什么例外?如果是公共的
,您应该能够毫无例外地简单访问my
的方法。你能发布你的脚本(Groovy和JavaScript)吗?@Philipp我不确定语法,所以我尝试了JavaScript(print(my.getName())
,这给出了一个关于它不是函数和print(my.name)的例外
打印未定义的。在groovy中,它似乎认为它是字符串
,因此异常表示字符串
没有该属性…我的groovy语法是println“$my.name”
-但是,我将对象作为实际对象,我不会将其转换为StringThank,它可以工作..然后我删除了静态并将MyClass移动到同一项目中的另一个包中。我得到了一个ClassNotFoundException…我想知道我需要做什么,以便ScriptEngine知道在哪里可以找到该类?-我想这可能是在我在实际项目中遇到的问题的根源,即使异常或错误消息不是“ClassNotFoundException”,只要该类是公共的且在您的类路径上可用,这通常不是问题。为了简单起见,我只将其保存在一个文件中。您能发布一个未运行的示例吗?这是该项目的屏幕截图。忽略另一个背景选项卡..似乎还有另一个问题。错误不是关于MyClass
的,而是关于找不到的JavaScriptEngineSample
。因此您的main
方法从未执行过!啊,好的,谢谢Philipp-我重新启动了IDE,没有碰任何东西-按下运行按钮,现在它工作正常。我仍然很好我不确定在我的实际项目中发生了什么,但至少现在我知道它应该可以工作,我可以做更多的调查。当我发布时,我不确定它是否应该工作,特别是因为有一个例外告诉我它正在将put变量转换为字符串(即使我的代码没有做任何这样的转换)
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());
}
}