0
我希望能夠使用節點的Java(https://github.com/joeferner/node-java)從Javascript傳遞一個匿名函數去渣。下面是Java代碼的樣本:node-java是否允許匿名函數作爲參數傳遞給java?
public class Example {
public Example() {
}
public interface Callback {
public void f();
}
public void method1(boolean flag, Callback c) {
System.out.println("flag value: " + flag);
if (flag) {
System.out.println("About to call callback");
c.f();
System.out.println("Called callback");
}
else {
System.out.println("Didn't call callback");
}
}
}
這裏就是我想從Javascript調用它:
例1:
var java = require('java');
java.classpath.push('test8');
var Example = java.import('Example');
var anonF =() => {
console.log("Hello from callback!");
}
var e = new Example();
e.method1Sync(true, anonF);
這將引發一個錯誤:
flag value: true
About to call callback
/Users/chris.prince/Desktop/Tests/test.js:11
e.method1Sync(true, anonF);
^
Error: Error running instance method
java.lang.NullPointerException
at Example.method1(Example.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at Error (native)
at Object.<anonymous> (/Users/chris.prince/Desktop/Tests/test.js:11:3)
at Module._compile (module.js:556:32)
at Object.Module._extensions..js (module.js:565:10)
at Module.load (module.js:473:32)
at tryModuleLoad (module.js:432:12)
at Function.Module._load (module.js:424:3)
at Module.runMain (module.js:590:10)
at run (bootstrap_node.js:394:7)
at startup (bootstrap_node.js:149:9)
我也試過傳入一個Javascript模塊作爲參數,並且ha也無法讓這個工作。
實施例2:
在文件 「theModule.js」:
exports.f = function() {
console.log("Hello From The Module!");
};
這裏的主叫Javascript代碼:
var theModule = require('./theModule');
var java = require('java');
java.classpath.push('test8');
var Example = java.import('Example');
var e = new Example();
e.method1Sync(true, theModule);
該第二實施例也將失敗,錯誤:
flag value: true
About to call callback
/Users/chris.prince/Desktop/Tests/test.js:8
e.method1Sync(true, theModule);
^
Error: Error running instance method
java.lang.NullPointerException
at Example.method1(Example.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at Error (native)
at Object.<anonymous> (/Users/chris.prince/Desktop/Tests/test.js:8:3)
at Module._compile (module.js:556:32)
at Object.Module._extensions..js (module.js:565:10)
at Module.load (module.js:473:32)
at tryModuleLoad (module.js:432:12)
at Function.Module._load (module.js:424:3)
at Module.runMain (module.js:590:10)
at run (bootstrap_node.js:394:7)
at startup (bootstrap_node.js:149:9)
想法?
你是說,在第一個例子中的回調,即使你通過'FALSE'叫什麼名字?你傳遞'true',所以當然它會調用回調函數。順便說一句,你可以使用'java.lang.Runnable'而不是'Callback',並且你不需要圍繞Javascript箭頭函數體的大括號。 –
我的不好。這是一個較早版本的示例,即使我通過了'false',回調也被調用。具體來說,當我調用'e.method1(true,anonF);'或'e.method1(false,anonF);','anonF'時會被調用。我編輯了我的第一個例子。 –