2015-10-20 115 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()),所以这里没有魔法,尽管我有一些其他的逻辑来实现相同的结果。