Java ScriptEngine 解析js

Java ScriptEngine 解析js

1、脚本引擎

 ① 通过脚本名称获取: 
     ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); 

 pasting

  1.  ScriptEngineManager manager = new ScriptEngineManager();    
  2.         ScriptEngine engine = manager.getEngineByName("JavaScript");

 

2、方法调用 

 

 

    Java虚拟机支持脚本的意义在于实现函数式的编程,即脚本中最重要的便是方法。一些脚本引擎允许使用者单独调用脚本中的某个方法,支持此操作的脚本引擎可以通过实现javax.script.Invocable接口,支持顶层方法或者某对象中成员方法的调用。使用方法调用时最好先检查脚本引擎是否实现了Invocable接口,JavaSE中的JavaScript引擎已实现了Invocable接口。 

 

① 在Java中调用脚本中的顶层方法 

[java] view plain copy
  1. public void invokeFunction() throws ScriptException, NoSuchMethodException {    
  2.     ScriptEngine engine = getJavaScriptEngine();    
  3.     String scriptText = "function greet(name) { println('Hello, ' + name); } ";    
  4.     engine.eval(scriptText);    
  5.     Invocable invocable = (Invocable) engine;    
  6.     invocable.invokeFunction("greet""Alex");    
  7. }    

 3、示例代码

 

 

 Reader scriptReader = null ;
        try {
            String configFileRootDir = System.getProperty("configFileRootDir") ;
            if(StringUtils.isNotBlank(configFileRootDir)){
                File jsFile = new File(configFileRootDir+File.separator+"collectscript"+File.separator+scriptFileName);
                LOGGER.debug("scriptReader jsFile.getAbsolutePath(): "+jsFile.getAbsolutePath());
                scriptReader = new InputStreamReader(new FileInputStream(jsFile)) ;
            }else{
                scriptReader = new InputStreamReader(JavaScriptJMXUtil.class.getClassLoader().getResourceAsStream("collectscript/" + scriptFileName));
            }
            ScriptEngineManager manager = new ScriptEngineManager() ;
            ScriptEngine engine = manager.getEngineByName("JavaScript");
            engine.eval(scriptReader) ;
            if(engine instanceof Invocable){
                Invocable invEngine = (Invocable)engine ;
                Map<String,Object> resultMap = (HashMap)invEngine.invokeFunction("collectEntranceFunction",kpiArray,jmx_hostname,jmx_port,jmx_username,jmx_pwd,mBeanUri);
                }
                return resultMap ;
            }

 

          被调用的 test.js 文件

var logger = org.slf4j.LoggerFactory.getLogger("jmx_activemq_kpitemp.js");
var util = new com.ai.toptea.jmx.monitor.javascript.platform.CassandraPlatformUtil();  //java 类实现公共方法

 

function collectEntranceFunction(kpiArray,jmx_hostname,jmx_port,jmx_username,jmx_pwd) {
    logger.info("execute jmx_activemq_kpitemp.js...");
    var msc = util.initMBeanServerConnAndReturn(jmx_hostname,jmx_port,jmx_username,jmx_pwd);
    var resultMap = new java.util.HashMap();
    for(var i=0 ; i<kpiArray.length ; i++ ){
        resultMap.put(kpiArray[i],this[kpiArray[i]](msc));
    }
    util.closeJMXConnector();//关闭JMXConnector连接
    logger.info("execute jmx_activemq_kpitemp.js completed.");
    return resultMap;
}

 

posted on 2017-06-22 18:10  tigerloveapple  阅读(8804)  评论(0编辑  收藏  举报