最近遇到这么一个问题,如何让用户在软件中自定义函数。

举个例子,使用Java做一个小的监控系统,用户A希望CPU超过90%的时候报警,B用户希望内存超过90%的时候报警,C用户希望CPU超过90%或者内存超过80%的时候报警,D用户希望CPU超过60%且硬盘剩余小于10%的时候报警……

程序员之力有限,而用户之欲无魇。以开发追需求,如抱薪救火,不妨让用户自己定义报警的规则。

我们当然不需要为此开发一种脚本语言,我觉得JavaScript就是一种不错的语言。我们以一个单输入单输出的函数为例讲解如何使用雷锋来推倒雷峰塔……不对,用Java解析JavaScript。

首先我们新建一个Java工程(完整代码见最后)。

随后新建一个JavaScript解析器:

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript");

加载我们的脚本:

脚本长这样:

function (x){
return x+1;
};

加载之:

String js_code = readToString("scripts/user_define.js");

随后尝试处理:

try {
engine.put("udfun", engine.eval(js_code));
for (int i = 1; i < 10; ++i) {
engine.put("val", i);
System.out.printf("f(%d)=%f\n",i,engine.eval("udfun(val);"));
}
} catch (ScriptException e) {
e.printStackTrace();
}

可以看到我们先用了一个 engine.put("udfun", engine.eval(js_code));   加载函数,这样避免反复解析函数,随后不停地将数值put到js引擎中去,最后输出相应的结果。

只要修改相应的JavaScript脚本就可以加载不同的配置。

软件中大多数不确定的,且执行频率不是特别高的,性能要求不高的地方都可以这样留个口子。

附上完整的Java代码:

 package javascriptevaltest;

 import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException; public class JavascriptEvalTest { public static void main(String[] args) {
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("javascript"); String js_code = readToString("scripts/user_define.js");
try {
engine.put("udfun", engine.eval(js_code));
for (int i = 1; i < 10; ++i) {
engine.put("val", i);
System.out.printf("f(%d)=%f\n",i,engine.eval("udfun(val);"));
}
} catch (ScriptException e) {
e.printStackTrace();
}
} public static String readToString(String fileName) {
String encoding = "ISO-8859-1";
File file = new File(fileName);
Long filelength = file.length();
byte[] filecontent = new byte[filelength.intValue()];
try {
FileInputStream in = new FileInputStream(file);
in.read(filecontent);
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
return new String(filecontent, encoding);
} catch (UnsupportedEncodingException e) {
System.err.println("The OS does not support " + encoding);
e.printStackTrace();
return null;
}
} }

JavaScript代码在上面,略。

雷锋推到雷峰塔,Java implements Javascript。的更多相关文章

  1. Java 和 Javascript的关系

    写这篇文章是因为看到有人问这个问题,在想怎么会有这种SB问题,不过想想当初SB的我貌似也搞不清两者的关系,认知还是需要一个过程. 然后看到比较经典的回答有:Java 和Javascript的关系就像雷 ...

  2. Java和JavaScript中使用Json方法大全

    林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka   摘要:JSON(JavaScript Object Notation) 是一种轻量级的数 ...

  3. Java 与 JavaScript 对websocket的使用

    ebsocket,HTML5中新一代全双工通信协议.其底层仍然是http协议. 传统 HTTP 请求响应客户端服务器交互图 WebSocket 请求响应客户端服务器交互图 WebSocket 客户端支 ...

  4. javascript与java的相互调用,纯java的javascript引擎rhino(转载)

    1.下载Rhino安装包,下载地址:官网http://www.mozilla.org/rhino. 2.rhino环境配置,把解压出来的js.jar文件加入到系统的环境变量classpath 3.在命 ...

  5. Json学习总结(1)——Java和JavaScript中使用Json方法大全

    摘要:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语 ...

  6. Java和JavaScript之间的区别

    1.简介 通过优锐课核心java学习笔记中,我们可以看到,Java和JavaScript之间的区别.我们将在本文中比较Java语言和JavaScript语言.JavaScript由Netscape开发 ...

  7. paip.java 以及JavaScript (js) 的关系以及区别

    paip.java 以及JavaScript (js) 的关系以及区别 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http:// ...

  8. WebView上实现Java与JavaScript交互

    在安卓开发上,考虑到开发效率和界面更新,有时使用WebView结合web页面技术,可以快速迭代地开发移动应用.WebView加载资源的速度并不慢,但是如果资源多了,就很慢.图片.css.js.html ...

  9. 30个深度学习库:按Python、C++、Java、JavaScript、R等10种语言分类

    30个深度学习库:按Python.C++.Java.JavaScript.R等10种语言分类 包括 Python.C++.Java.JavaScript.R.Haskell等在内的一系列编程语言的深度 ...

随机推荐

  1. background系列属性

    1.background-color背景颜色属性 ①颜色表示方法 英语单词:red   blue   purple    skyblue. rgb:r代表红色   g代表绿色   b代表蓝色    也 ...

  2. SVG页面loading动态图

    https://github.com/SamHerbert/SVG-Loaders demo http://samherbert.net/svg-loaders/

  3. mysql安装使用----1 安装和启动

    1 安装 Fedora16/17 Mysql 安装及配置 1.安装 Mysql Server # yum install mysql mysql-server 2.开启 MySQL server 及开 ...

  4. SDWEBImage和collectionView的组合,以及collectionView的随意间距设置

    #import "ViewController.h" #import <ImageIO/ImageIO.h> #import "UIImageView+Web ...

  5. 关于iOS性能调优

    性能调优一直都是作为高阶iOS开发者的一个入门门槛,下面我搜集了日常查阅资料中见到的各种高质量调优博文,仅供参考 UIKit性能调优实战讲解 iOS 高效添加圆角效果实战讲解

  6. Servlet中的过滤器Filter用法

    1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应. 主要用于对HttpServletRequest 进行预处理,也可以对Http ...

  7. STM32中的位带(bit-band)操作(转)

    源:STM32中的位带(bit-band)操作 支持了位带操作后,可以使用普通的加载/存储指令来对单一的比特进行读写.在 CM3 中,有两个区中实现了位带.其中一个是 SRAM 区的最低 1MB 范围 ...

  8. xml--笔记

    1.例子 <?xml version="1.0" encoding="utf-8"?> <!--引用css样式文件--> <?xm ...

  9. IOS9任务管理器特效的实现

    IOS9任务管理器特效的实现 IOS9中通过双击home键可以打开任务管理器,和以前版本不一样的地方时这这次使用的3D的特效,见下图: 那么如何在我们的APP中也制作出这样的特效呢?在GItHub上有 ...

  10. UVa 10299 - Relatives

    题目大意:Euler's Totient的应用. 几乎和UVa 10179 - Irreducable Basic Fractions一样,于是偷了个懒,直接用10179题的代码,结果WA了,感觉一样 ...