2017-05-08 45 views
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) 

想法?

+0

你是說,在第一個例子中的回調,即使你通過'FALSE'叫什麼名字?你傳遞'true',所以當然它會調用回調函數。順便說一句,你可以使用'java.lang.Runnable'而不是'Callback',並且你不需要圍繞Javascript箭頭函數體的大括號。 –

+0

我的不好。這是一個較早版本的示例,即使我通過了'false',回調也被調用。具體來說,當我調用'e.method1(true,anonF);'或'e.method1(false,anonF);','anonF'時會被調用。我編輯了我的第一個例子。 –

回答

0

雖然晚了一點,我將添加我的答案:

你有沒有嘗試使用ProxyCallback接口? 我沒有運行此代碼自己,但它應該是這個樣子:

var java = require('java'); 
java.classpath.push('test8'); 

var Example = java.import('Example'); 
var myCallbackProxy = java.newProxy('Callback', { 
    f: function() { 
    console.log("Hello from callback!"); 
    } 
}); 

var e = new Example(); 
e.method1Sync(true, myCallbackProxy); 
相關問題