尝试编写脚本时无法从 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 展示了相似的例子,除了它们都有效。我做错了什么?
有两个问题:
您正在尝试从包外部调用非 public
方法(您的 Java 脚本代码不在 myPackage
中)。 test
需要 public 才能调用它。
您是在 class 的 实例 上进行调用,而不是 class 本身,而是 test
是 static
。 Java 允许通过实例引用调用静态方法(这是 Java 中比较奇怪的事情之一),但是 JavaScript 没有这个概念。您需要将 test
设为实例方法,或者改为在 myJSClass
上调用它。
解决这些问题,就可以了。 :-)
我正在尝试使用简单的 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 展示了相似的例子,除了它们都有效。我做错了什么?
有两个问题:
您正在尝试从包外部调用非
public
方法(您的 Java 脚本代码不在myPackage
中)。test
需要 public 才能调用它。您是在 class 的 实例 上进行调用,而不是 class 本身,而是
test
是static
。 Java 允许通过实例引用调用静态方法(这是 Java 中比较奇怪的事情之一),但是 JavaScript 没有这个概念。您需要将test
设为实例方法,或者改为在myJSClass
上调用它。
解决这些问题,就可以了。 :-)