从 nashorn(JDK 8 Java脚本引擎)调用一个接受 char[] 输入参数的 Java 函数?

Invoking a Java function taking a char[] input parameter from nashorn (JDK 8 JavaScript engine)?

我想调用一个 Java 函数,从 Oracle 的 nashorn Java 脚本引擎中获取一个 char[] 输入参数(非数组参数类型的函数对我来说工作正常)。

如果我使用 Java脚本字符串文字调用 Java 函数,nashorn 会停止工作

javax.script.ScriptException: TypeError: Can not invoke method
[jdk.internal.dynalink.beans.SimpleDynamicMethod
void org.xml.sax.DocumentHandler.characters(char [],int,int)]
with the passed arguments; they do not match any of its
method signatures.

如您所见,我正在尝试从 JavaScript/nashorn 调用在 Java 中实现的 SAX 1 DocumentHandler,当然我也提供了 int 参数。

http://winterbe.com/posts/2014/04/05/java8-nashorn-tutorial/ and http://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/api.html 我知道要将 Java 脚本字符串转换为 Java char[] 数组我必须使用如下代码:

// laboriously converting a string into a Java char array
var text = "bla"
var charArrayType = Java.type("char[]")
var charArray = new charArrayType(text.length)
for (var i = 0; i < text.length; i++)
   charArray[i] = text.charAt(i)

但是,如果我现在使用 charArray 作为参数调用 Java 函数,我仍然会收到上述错误消息。

我认为您的方法调用还有一些其他问题,因为您的方法对我有用:

var docHandlerType = Java.type("org.xml.sax.HandlerBase");
var docHandler = new docHandlerType();
var charArrayType = Java.type("char[]");
var chars = new charArrayType(2);
chars[0] = "x".charAt(0);
chars[1] = "y".charAt(0);
docHandler.characters(chars, 0, 2);
print("Successfully called DocumentHandler.characters");

您可能对 documentHandler.characters(char[], int, int) 的第二个和第三个参数有问题:它们被省略了,还是它们的值不是整数?

就其价值而言,您只需在普通字符串文字上使用 toCharArray() 即可避免费力的字符数组循环:

var docHandlerType = Java.type("org.xml.sax.HandlerBase");
var docHandler = new docHandlerType();
docHandler.characters("bla".toCharArray(), 0, 3);
print("Successfully called DocumentHandler.characters");