有没有办法从JavaScript(Nashorn)获取和使用扩展Java类?
我想要做的是在Nashorn中扩展Java类,然后将其传递回Java。例如,我们定义了一个在JS中扩展另一个类的类:
var SomeClass= Java.type("com.test.SomeClass");
var MySomeClass = Java.extend(SomeClass, {
aMethod1: function() {
print("m1");
},
aMethod2: function() {
print("m2");
},
});
然后我试图用Java来获取这个扩展对象:Object mySomeClass = scriptEngine.get("MySomeClass");
但是,我无法在Java中对此对象进行任何方法调用。当我尝试将其强制转换为基类时,它总是抛出异常 - com.test.SomeClass
。
是否可以在Java中使用在Nashorn(JS)中创建的扩展类?
答案 0 :(得分:3)
这是一个扩展 ArrayList 的工作示例:
String script = "(function() {\n" +
" var ArrayList = Java.type('java.util.ArrayList')\n" +
" var ArrayListExtender = Java.extend(ArrayList)\n" +
" var list = new ArrayListExtender() {\n" +
" get: function(idx) {\n" +
" return idx >= list.size() ? " +
"'no such value' : Java.super(list).get(idx);\n" +
" }\n" +
" }\n" +
" return list;\n" +
"} ());";
ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
@SuppressWarnings("unchecked")
List<String> result = (List<String>) engine.eval(script);
result.add("gotcha");
System.out.println(result.get(0));
System.out.println(result.get(10));
您没有说明您获得的异常,但问题可能在于您如何使用或使用该类型。请注意, Java.type 和 Java.extend 都不返回 java.lang.Class - 这些方法返回带有未记录API的内部Nashorn类型