我尝试使用简单的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介绍材料都显示了类似的例子,除了它们都有效。我做错了什么?
答案 0 :(得分:2)
有两个问题:
您尝试从包外调用非public
方法(您的JavaScript代码不在myPackage
中)。 test
需要公开才能让您拨打电话。
您正在对班级的实例进行调用,而不是在班级本身,但test
为static
。 Java允许通过实例引用调用静态方法(这是关于Java的一个奇怪的事情),但JavaScript没有这个概念。您需要将test
作为实例方法,或者在myJSClass
上调用它。
修复它们,它有效。 : - )