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

 

转载于:https://www.cnblogs.com/jing1617/p/7066463.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30614109/article/details/95253203

智能推荐

精益DevOps:优化流程,提升效能【文末送书】_devops平台提升效率-程序员宅基地

文章浏览阅读4.2k次,点赞25次,收藏15次。本书为IT服务交付团队及其领导者撰写,从精益思想和精益管理的视角,深入探讨了DevOps方法的核心要素(如任务式指挥、摩擦、风险、态势感知等),并结合实际案例,阐述了如何通过DevOps方法解决IT服务交付中的各种问题,如何在整个组织内改善信息流,从而向客户的目标成果迈进。此外,本书还提供了许多实用的工具和技巧,包括OODA循环、Cynefin框架、服务交付的成熟度模型和服务工程负责人等,以帮助读者更好地应用DevOps方法。_devops平台提升效率

React中,使用codeMirror设置代码高度自适应_react codemirror 自适应高度-程序员宅基地

文章浏览阅读4.2k次。在对应的less文件下,设置样式:global .CodeMirror { /* Set height, width, borders, and global font properties here */ font-family: monospace; height: auto; color: black; direction: ltr;}..._react codemirror 自适应高度

百问网STM32157适配正点原子7寸电容屏(1024X600)_touchscreen-size-x-程序员宅基地

文章浏览阅读1.5k次。百问网STM32157适配正点原子7寸电容屏(1024X600)文章目录1.修改设备树文件2.修改edt-ft5x06.c(触摸驱动)3.修改QT环境变量(重要,踩坑)1.修改设备树文件由于百问网STM32MP157的触摸IC与HDMI驱动IC复用,因此需要完成以下几个步骤(1)在stm32mp157c-100ask-512d-lcd-v1.dts文件中对i2c4节点增加ft5x06触摸的描述信息,具体参考正点原子STM32MP157开发板的配套源码,如下在正点原子出厂linux源码中找到stm3_touchscreen-size-x

pso神经网络用python_基本pso优化神经网络程序-程序员宅基地

文章浏览阅读901次。clcclearall%一、初始化部分%1.1预处理样本数据%选取训练样本(x,y)fori=1:126x=0+0.0251*(i-1);y(i)=(sin(x)+(x.^2/9+x/3)*exp((-0.5)*(x.^2)))/2;%待逼近函数endAllSamIn=0:0.0251:pi;%训练样本输入AllSamOut=y;%训练样本输出%选取测试样本fori=1:125x=0.0125+..._pid神经网络优化 python

MFC slider滑动条OnNMCustomdrawSlider(NMHDR *pNMHDR, LRESULT *pResult)事件_onnmthemechangedtranslatexslider-程序员宅基地

文章浏览阅读6.8k次。鼠标拖动滑动条的时候,触发事件OnNMCustomdrawSlider(NMHDR *pNMHDR, LRESULT *pResult)但是在窗体被其他页面遮挡重新显示在屏幕最前面的时候也会触发这个事件,例如最小化重新最大化的时候。网友对三种消息类型的解释:NM_CUSTOMDRAW,是子控件通知其父控件它已经完成重画功能,对Slider来说也就是我们每次鼠标按住滑块移动一下就_onnmthemechangedtranslatexslider

jquery-ui日期时间控件实现_jquery ui picker-程序员宅基地

文章浏览阅读7.9k次。日期控件和时间控件为独立控件,日期时间控件要同时导入日期控件和时间控件的js,然后在日期控件添加时间控件显示参数,没有导入时间控件js,日期控件函数设置的时间控件参将包错日期官网网址:http://jqueryui.com/日期控件js:jquery-ui.js对应函数及默认属性设置:function Datepicker()时间官网网址:http://plugins._jquery ui picker

随便推点

经典神经网络论文超详细解读(一)——AlexNet学习笔记(翻译+精读)_alexnet论文-程序员宅基地

文章浏览阅读5.5k次,点赞41次,收藏106次。AlexNet(ImageNet Classification with Deep Convolutional Neural Networks)论文超详细解读。翻译+总结_alexnet论文

在Ubuntu上编译安装LLVM_ubuntu hexagon llvm 8.5.09-程序员宅基地

文章浏览阅读1.1w次,点赞12次,收藏36次。Motivation两周前实验室要求我配置一个叫Speedy.js的编译器,配置这个编译器需要先配置好LLVM。根据这个编译器作者的教程,乱七八糟配置了一通,踩过一些坑,碰过一些雷,浪费了很多时间。花了两周时间,终于全套配置完成,因此想写个教程,留点知识给以后的自己和需要的各位。Speedy.js不好说,但是LLVM这东西以后有大概率会用的上。环境这是我这次配置LLVM过程中最大的_ubuntu hexagon llvm 8.5.09

Anaconda+Tensorflow_Gpu+Spyder安装记录(2022年10月14日更新)_anaconda navigator安装spyderd慢-程序员宅基地

文章浏览阅读1.9k次,点赞7次,收藏15次。2022年6月13日-记录Anaconda+tensorflow_gpu-2.9.0+spyder5.3.1+py3.9安装过程,回忆一下踩过的坑_anaconda navigator安装spyderd慢

数据预处理流程图思维导图-程序员宅基地

文章浏览阅读2.6k次。_数据预处理流程图

Abnova LiquidCell-负富集细胞分离和回收系统-程序员宅基地

文章浏览阅读129次。艾美捷Abnova LiquidCell 是一种非侵入性负富集系统,用于消耗白细胞 (WBC) 以及计数和回收循环稀有细胞 (CRC)。_负富集

构建稳固的数据基础,GaussDB与产业紧密合作-程序员宅基地

文章浏览阅读17次。为了有效地管理和利用大规模数据,企业需要一个强大而可靠的数据底座。本文将介绍GaussDB的特点和优势,并提供相应的源代码示例,以展示其在数据管理方面的强大功能。总结而言,GaussDB作为一种高性能、可扩展和高可靠性的分布式数据库管理系统,与产业界紧密合作,为企业构建了稳固的数据基础。通过示例代码,我们展示了GaussDB的基本用法,希望能够帮助读者更好地了解和应用这一强大的数据管理工具。它支持数据备份和恢复,以及故障转移和自动故障转移,确保数据库在出现故障时能够自动切换到备用节点,保持业务的连续性。

推荐文章

热门文章

相关标签