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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM