尝试编写脚本时无法从 JavaScript 访问 class 方法

Can't access class methods from JavaScript when trying scripting

我正在尝试使用简单的 Nashorn 示例通过 Java 测试 JavaScript,但我只是不明白为什么我无法访问自己的方法 class 来自 JS 调用。

首先,我想合作的class:

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 介绍 material 展示了相似的例子,除了它们都有效。我做错了什么?

有两个问题:

  1. 您正在尝试从包外部调用非 public 方法(您的 Java 脚本代码不在 myPackage 中)。 test 需要 public 才能调用它。

  2. 您是在 class 的 实例 上进行调用,而不是 class 本身,而是 teststatic。 Java 允许通过实例引用调用静态方法(这是 Java 中比较奇怪的事情之一),但是 JavaScript 没有这个概念。您需要将 test 设为实例方法,或者改为在 myJSClass 上调用它。

解决这些问题,就可以了。 :-)