zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    SQL语句编写
    触发器
    plot函数中的type中的参数
    【转】R中read.table详解
    7月18日R笔记
    RMySQL在windows下的安装方法
    WinXP下面实现JAVA对R调用 (rJava包设置)
    用R进行文档层次聚类完整实例(tm包)
    R学习之R层次聚类方法(tm包)
    R对term进行层次聚类完整实例(tm包)
  • 原文地址:https://www.cnblogs.com/jing1617/p/7066463.html
Copyright © 2011-2022 走看看