2015-10-20 114 views
-1

是否可以登錄到Java控制檯?從Javascript登錄到控制檯

我試圖提供一個對象上有一個方法用於日誌記錄,但沒有顯示在調試控制檯中。

我錯過了什麼嗎?

window.setMember("mylog", new Console()); 

execute("mylog.log('11111111')) 

public class Console { 
     public void log(Object ... objects) { 
      Logger...get..then..log(obj); 
     } 
} 

有沒有登錄到Java控制檯更好的辦法?

這不起作用。

+0

什麼? java是爲了像JavaScript一樣的汽車去地毯。 – Neal

+0

@Neal你需要回到2015年。另外,Rhino + EnvJS可以做得很好。 – momomo

+0

@Neal感謝downvote。但我確實找出了這個問題的答案。 – momomo

回答

0

不幸的是,我的代碼依賴於一些庫,我無法推動解決方案到UI4J回購。

它基本上覆蓋了正常的console.log並且工作方式類似。 它有意避免JSON.stringify(對象)因爲循環依賴可能導致嚴重問題。

代碼:

import netscape.javascript.JSObject; 
    import momomo.com.Opensource.sources.Functional.lambdas.version.interfaces.Lambda; 


        .... 

        try { 
          this.page = navigate(IO.toString(file)); 
          putConsole(); 
        } 
        finally { 
          IO.remove(file); 
        } 


      private void putConsole() { 
        // Note that we call log using the entire arguments (array) 
        execute("console.log = function() {" + 
          put(CONSOLE) + ".log(arguments);" + 
        "};"); 
      } 
    } 

    private static final Console CONSOLE = new Console(); 
    public static final class Console { 
      public void log(JSObject js) { 

        StringBuilder sb = new StringBuilder(); 
        iterate(js, (o) -> { 
          sb.append(o).append(" "); 
        }); 

        $Log.info(Console.class, sb.toString()); 
      } 
    } 

    public static void iterate(JSObject js, Lambda.V1<Object> lambda) { 
      iterate(js, lambda.R1()); 

    } 
    public static void iterate(JSObject js, Lambda.R1<Boolean, Object> lambda) { 
      if (js != null) { 
        Object member; 

        int i = 0; 
        while (true) { 
          member = js.getSlot(i); 

          if ("undefined".equals(member) || Is.False(lambda.call(member))) { 
            return; 
          }        

          i++; 
        } 

      } 
    } 

過時,而且有用Lambda.java參考:

https://github.com/momomo/Opensource/blob/master/src/momomo/com/Opensource/sources/Functional/lambdas/version/interfaces/Lambda.java

注意把(臺)可撥打以上,基本要求執行( 「窗口」)setMember (「key」,新的Console()),所以這裏沒有魔法,儘管我有一些其他的邏輯來實現相同的結果。