java Nashorn引用错误

java Nashorn引用错误,java,nashorn,Java,Nashorn,我正在和纳肖恩做一些体验 为此,我用java编写了这段简单的代码,我想使用我定义的自定义对象 ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript"); System.out.println("engine = " + engine.getClass().getName().toString()); engine.put("id", "2"

我正在和纳肖恩做一些体验

为此,我用java编写了这段简单的代码,我想使用我定义的自定义对象

       ScriptEngine engine = new 
       ScriptEngineManager().getEngineByName("javascript");
       System.out.println("engine = " + engine.getClass().getName().toString());

       engine.put("id", "2");
       System.out.println("id = " + engine.eval("id"));

       Object person = engine.eval("importClass(Data.com.personal.Person)");
我返回以下错误:

        Exception in thread "main" javax.script.ScriptException: ReferenceError: "importClass" is not defined in <eval> at line number 1
但是我有点搞不清楚我把这个加载函数放在哪里(或者如何使用)


更新

要使用nashorn导入课堂作业,必须这样调用:

    engine.eval("importClass(com.personal.Person)");

出于某种原因,我并不清楚:p使用Nashorn,您应该使用:

var MyJavaClass=Java.type('my.package.MyJavaClass')

现在您可以使用自定义Java类了

有关更多信息,请参阅本介绍:

完整示例:

public final class NashornTest {

    // Class can even be inner class. Must be public however!
    public static class MyData {

        private int id;
        private String name;

        public MyData(int id, String name) {
            this.id = id;
            this.name = name;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return String.format("MyData[%d, %s]", id, name);
        }

    }

    @Test
    public void test() throws ScriptException {
        final ScriptEngineManager sem = new ScriptEngineManager();
        final ScriptEngine se = sem.getEngineByName("javascript");

        Object obj = se.eval(
            "var MyJavaData = Java.type('test.el.NashornTest$MyData');" +
            "new MyJavaData(42, 'The usual number');");

        // prints MyData[42, The usual number]
        System.out.println(obj);
    }

}

好的,缺失的步骤很明显,我需要调用engine.eval中的load
public final class NashornTest {

    // Class can even be inner class. Must be public however!
    public static class MyData {

        private int id;
        private String name;

        public MyData(int id, String name) {
            this.id = id;
            this.name = name;
        }

        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return String.format("MyData[%d, %s]", id, name);
        }

    }

    @Test
    public void test() throws ScriptException {
        final ScriptEngineManager sem = new ScriptEngineManager();
        final ScriptEngine se = sem.getEngineByName("javascript");

        Object obj = se.eval(
            "var MyJavaData = Java.type('test.el.NashornTest$MyData');" +
            "new MyJavaData(42, 'The usual number');");

        // prints MyData[42, The usual number]
        System.out.println(obj);
    }

}