雷锋推到雷峰塔,Java implements Javascript。

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

举个例子,使用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代码:

 1 package javascriptevaltest;
 2
 3 import java.io.File;
 4 import java.io.FileInputStream;
 5 import java.io.FileNotFoundException;
 6 import java.io.IOException;
 7 import java.io.UnsupportedEncodingException;
 8 import javax.script.ScriptEngine;
 9 import javax.script.ScriptEngineManager;
10 import javax.script.ScriptException;
11
12 public class JavascriptEvalTest {
13
14     public static void main(String[] args) {
15         ScriptEngineManager manager = new ScriptEngineManager();
16         ScriptEngine engine = manager.getEngineByName("javascript");
17
18         String js_code = readToString("scripts/user_define.js");
19         try {
20             engine.put("udfun", engine.eval(js_code));
21             for (int i = 1; i < 10; ++i) {
22                 engine.put("val", i);
23                 System.out.printf("f(%d)=%f\n",i,engine.eval("udfun(val);"));
24             }
25         } catch (ScriptException e) {
26             e.printStackTrace();
27         }
28     }
29
30     public static String readToString(String fileName) {
31         String encoding = "ISO-8859-1";
32         File file = new File(fileName);
33         Long filelength = file.length();
34         byte[] filecontent = new byte[filelength.intValue()];
35         try {
36             FileInputStream in = new FileInputStream(file);
37             in.read(filecontent);
38             in.close();
39         } catch (FileNotFoundException e) {
40             e.printStackTrace();
41         } catch (IOException e) {
42             e.printStackTrace();
43         }
44         try {
45             return new String(filecontent, encoding);
46         } catch (UnsupportedEncodingException e) {
47             System.err.println("The OS does not support " + encoding);
48             e.printStackTrace();
49             return null;
50         }
51     }
52
53 }

JavaScript代码在上面,略。

时间: 2024-10-12 20:49:52

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

Java 和 Javascript的关系

写这篇文章是因为看到有人问这个问题,在想怎么会有这种SB问题,不过想想当初SB的我貌似也搞不清两者的关系,认知还是需要一个过程. 然后看到比较经典的回答有:Java 和Javascript的关系就像雷锋和雷峰塔的感谢,也像老婆和老婆饼的关系. 一般认为,当时 Netscape 之所以将 LiveScript 命名为 JavaScript,是因为 Java 是当时最流行的编程语言,带有 "Java" 的名字有助于这门新生语言的传播. 它们的相同之处包括: 它们的语法和 C 语言都很相似:

Java和JavaScript中使用Json方法大全

林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka   摘要:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 它基于ECMAScript的一个子集. JSON採用全然独立于语言的文本格式,可是也使用了相似于C语言家族的习惯(包含C.C++.C#.Java.JavaScript.Perl.Python等).这些特性使JSON成为理想的数据交换语言. 易于人阅读和编写.同一时候也易于机器解析和生成

C++、Java、JavaScript中的正则表达式

编程思想之正则表达式 什么是正则表达式? 正则表达式(Regular Expression)就是用某种模式去匹配一类字符串的公式.如你要在一篇文章中查找第一个字是"罗"最后一个字是"浩"的三个字的姓名,即"罗*浩":那么"罗*浩"就是公式,也称作模式(Pattern),这篇文章就是要匹配的串(或叫文本text).再如,你要检查输入的一个字符串是否是126邮箱的格式,你得制定一个规则去查检,这种规则就是正则表达式. 从入门开始

java调用javascript :js引擎rhino

java调用javascript :js引擎rhino JavaJavaScriptEclipse脚本SQL 前段时间,在浏览javaeye论坛,看见有人征集如何在java中运行数学表达式.结果方案五花八门:1.jakarta commons JEXL. 2.Beanshell3.Java Math Expression Parser jep 4.parse combinator jparsec 5.jdk 6.0的 script6.利用SQL 7.自己写语法分析如果自己写语法分析,没有个200

从Java和JavaScript来学习Haskell和Groovy

直击现场 记得刚接触计算机的时候,我就受到了两个非常巨大的错误观念的影响,这个观念最初是来自于老师的传授还是学长的教诲已经记不清了,但是直到我工作几年以后,才慢慢有了实际的体会: 学习和使用什么编程语言不重要,重要的是算法和设计: 程序员学习的精髓是面向对象的设计模式,掌握以后,一通百通. 简直就是是胡扯啊.也许在某个极其狭隘的上下文中还能这样说,但是泛泛而谈,这样的态度无疑是误人子弟的. 就说第一条,编程语言不但重要,而且太重要了.换句话说,学习一门新的编程语言,可能学习的是背后的范型和思考问

java,jsp,javascript的区别

在我回答你问题之前请允许我对Java语言作一个简单的介绍,你不了解这些很难和你说明白你的问题Java是一种面向对象独立于平台的安全的计算机语言,你也可以认为它是一个平台这种语言针对应用领域不同,共分为三个版本JavaSE Java平台标准版 其属于Java基础部分,用JavaSE可以开发C/S架构的桌面式应用程序JavaME Java平台迷你版 用于为嵌入式设备开发应用程序,如手机或掌上电脑的软件.游戏之类的JavaEE Java企业开发版本 用于企业级软件的开发,用JavaEE可以开发大型的B

How java implements HashMap

1. How java implements HashMap HashMap Custom implementation in java - How HashMap works internally with diagrams and full program http://www.javamadesoeasy.com/2015/02/hashmap-custom-implementation.html 2. HashMap interview question 17.在Java中,HashMa

C++、Java、JavaScript中的日志(log)

编程思想之日志记录 什么是log? 相信你一定用日记写过点滴心事,或是用空间.微信.微博刷着动态,记录你每天的喜怒哀乐!在程序中也有一种类似的东西,记录着他主人(应用程序)每天的行踪,他叫日志(log).日记--是人类生活的记事本,日志(log)--是程序运行状况的记事本. 顾名思义,日志(log,后面均以log称之)就是用来记录程序每天的运行状况的,比如程序出现异常的情况,或是某个关键点,功某个重要的数据或交易等.这里的每天不是说每天一记,可以是伴随着程序运行的始终,只要程序在运行着就一直在记

Nashorn 在JDK 8中融合Java与JavaScript之力

从JDK 6开始,Java就已经捆绑了JavaScript引擎,该引擎基于Mozilla的Rhino.该特性允许开发人员将JavaScript代码嵌入到Java中,甚至从嵌入的JavaScript中调用Java.此外,它还提供了使用jrunscript从命令行运行JavaScript的能力.如果不需要非常好的性能,并且可以接受ECMAScript 3有限的功能集的话,那它相当不错了. 从JDK 8开始,Nashorn取代Rhino成为Java的嵌入式JavaScript引擎.Nashorn完全支