在尝试编写脚本时,无法从JavaScript访问类方法

时间:2018-02-21 18:36:12

标签: java nashorn

我尝试使用简单的Nashorn示例通过Java测试JavaScript,而我只是不理解为什么我无法通过JS调用访问我自己的类的方法。

首先,我想要使用的课程:

package myPackage;

public class myClass
{
    Object internalObj;


    static boolean test()
    {
        return true;
    }

    boolean storeObject(Object obj)
    {
        internalObj = obj;
        return true;
    }

    String whatObjectType()
    {
        return internalObj.getClass().toString();
    }

}

然后,提供脚本调用的代码:

package myPackage;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class myTester
{
    public static void main( String[] args )
    {
        System.out.println(">> Script Testing");

        //test out my class
        System.out.println(myClass.test());

        myClass myObj = new myClass();

        myObj.storeObject("test");

        System.out.println(myObj.whatObjectType());

        //now try the same from javascript
        ScriptEngine js = new ScriptEngineManager().getEngineByName("javascript");

        String myScript ="var myJSClass = Java.type('myPackage.myClass');"
                + "var myJSObj = new myJSClass();"
                + "print(myJSObj.test());";

        try
        {
            js.eval(myScript);
        } catch (ScriptException e)
        {
            e.printStackTrace();
        }       
    }
}

在评估myJSObj.test()时,一切都很顺利。这是输出:

>> Script Testing
true
class java.lang.String
javax.script.ScriptException: TypeError: myJSObj.test is not a function in <eval> at line number 1

大多数Nashorn介绍材料都显示了类似的例子,除了它们都有效。我做错了什么?

1 个答案:

答案 0 :(得分:2)

有两个问题:

  1. 您尝试从包外调用非public方法(您的JavaScript代码不在myPackage中)。 test需要公开才能让您拨打电话。

  2. 您正在对班级的实例进行调用,而不是在班级本身,但teststatic。 Java允许通过实例引用调用静态方法(这是关于Java的一个奇怪的事情),但JavaScript没有这个概念。您需要将test作为实例方法,或者在myJSClass上调用它。

  3. 修复它们,它有效。 : - )