Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果我将某个类的对象绑定到脚本引擎,如何使用脚本引擎将其作为该类的对象访问?_Java_Scripting_Java Scripting Engine - Fatal编程技术网

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());
    }
}