Java之戳中痛点 - (1)易变业务使用脚本语言编写
脚本语言的3大特征:
1、灵活:脚本语言一般是动态类型,可以不声明变量类型直接使用,也可以在运行期改变类型;
2、便捷:脚本语言是解释性语言,在运行期变更非常方便,而不用重启服务
3、简单:脚本语言语法比较简单,易学
另外:java6以上默认支持JavaScript
Java SE6加入了对JSR223的实现, JSR223旨在定义一个统一的规范,使得java应用程序可以通过一套固定的接口定义与各个脚本引擎交互,从而达到java平台上调用各个脚本语言的目的。
接口定义在javax.script下面。从而使java语言可以执行javascript,ruby,python等动态语言。
其中javascript的解析引擎是使用Mozilla Rhino不过是经过修改的。Mozilla Rhino是一个开源的java实现javascript的项目,jdk6中引入了Rhino1.6R2 版本,有了java对javascript的实现,对于java开发人员来说是一个非常便利事情。 下面将介绍如何在java代码中使用javascript。相关的实现在javax.script 包下面。
定义了 Invocable 、ScriptEngine 、ScriptEngineFactory 、Bindings 、ScriptContext 这5个主要接口。
例子:
package com.test; import java.io.FileNotFoundException;
import java.io.FileReader; import javax.script.Bindings;
import javax.script.Invocable;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException; /**
* java执行脚本语言
* @author jd
*
*/
public class javascript { public static void main(String[] args){ //获取一个JavaScript执行引擎
ScriptEngine se = new ScriptEngineManager().getEngineByName("javascript"); //声明上下文 变量
Bindings bind = se.createBindings();
bind.put("variable","结果:");
//变量的作用域,当前引擎范围内(常量ScriptContext.ENGINE_SCOPE表示的作用域对应的是当前的脚本引擎,而ScriptContext.GLOBAL_SCOPE表示的作用域对应的是从同一引擎工厂中创建出来的所有脚本引擎对象。前者的优先级较高。)
se.setBindings(bind,ScriptContext.ENGINE_SCOPE); try {
//执行js代码
se.eval(new FileReader("E:/model.js")); //是否可调用方法
if(se instanceof Invocable){
Invocable in = (Invocable) se;
//执行js的方法
String result = (String) in.invokeFunction("formula",2,10);
System.out.println(result);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (ScriptException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} } }
情景1:
function formula(a,b){
return variable+ (a*b);
}
结果:
结果:20
情景2:
function formula(a,b){
return variable+ (a+b);
}
结果:12
情景...
所以在变更业务时,不需要重启 java服务器,就可顺利变更业务,对于变更频繁的业务,这就是很好的解决方案。
PS:Java 6 不仅仅提供代码级的脚本内置,还提供了jrunscript命令工具,它可以在批处理中发挥巨大的效能,而且不需要通过JVM解释脚本语言,可直接通过该工具运行脚本;
Java之戳中痛点 - (1)易变业务使用脚本语言编写的更多相关文章
- 提高java编程质量 - (一)易变业务使用脚本语言编写
脚本语言的3大特征: 1.灵活:脚本语言一般是动态类型,可以不声明变量类型直接使用,也可以在运行期改变类型:2.便捷:脚本语言是解释性语言,在运行期变更非常方便,而不用重启服务3.简单:脚本语言语法比 ...
- [改善Java代码]易变业务使用脚本语言编写
建议16: 易变业务使用脚本语言编写 Java世界一直在遭受着异种语言的入侵,比如PHP.Ruby.Groovy.JavaScript等,这些“入侵者”都有一个共同特征:全是同一类语言—脚本语言,它们 ...
- Java之戳中痛点 - (4)i++ 和 ++i 探究原理
先看一个例子: package com.test; public class AutoIncrement { public static void main(String[] args) { int ...
- Java之戳中痛点 - (7)善用Java整型缓存池
先看一段代码: package com.test; import java.util.Scanner; public class IntegerCache { public static void m ...
- Java之戳中痛点 - (6)避免类型自动转换,例如两个整数相除得浮点数遇坑
先来看一个例子: package com.test; public class calculate { /** * 光速30万公里/秒 */ public static final int LIGHT ...
- Java之戳中痛点 - (8)synchronized深度解析
概览: 简介:作用.地位.不控制并发的影响 用法:对象锁和类锁 多线程访问同步方法的7种情况 性质:可重入.不可中断 原理:加解锁原理.可重入原理.可见性原理 缺陷:效率低.不够灵活.无法预判是否成功 ...
- Java之戳中痛点 - (5)switch语句break不能忘以及default不同位置的用法
先看一段代码: public class Test{ public static void main(String[] args){ System.)); } } public static Stri ...
- Java之戳中痛点 - (2)取余用偶判断,不要用奇判断
取余判断原则:取余用偶判断,不要用奇判断 先看一个 程序: package com.test; import java.util.Scanner; public class t1 { public s ...
- Java之戳中痛点 - (3)三目运算符的两个操作数类型尽量一致
先看一个例子: package com.test; public class TernaryOperator { public static void main(String[] args) { in ...
随机推荐
- BZOJ:2038: [2009国家集训队]小Z的袜子(hose)(莫队算法模板)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2038 解题心得: 第一次接触莫队算法,很神奇,很巧妙.莫队算法主要就是用来解决多次询问时 ...
- ABAP CDS ON HANA-(5)テーブル結合ビュー
JOINs in CDS View In ABAP CDS, Join between two data sources is allowed. Allowed joins are:- Inner J ...
- P1332 血色先锋队
P1332 血色先锋队 题目描述 巫妖王的天灾军团终于卷土重来,血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团,以及一切沾有亡灵气息的生物.孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重 ...
- Java:位移运算符
Java中有三个位移运算符,用于对int类型整数的二进制补码进行操作: 1. "<<": 左移运算符 在二进制补码末尾添加“0”,之前的其他位相当于左移了一位,可看作成 ...
- (原)MongoDB在系统中的使用
序)Nosql并不是要取代原有的数据产品,而是为不同的应用场景提供更多的选择. 一)结构类型 传统数据库的领域在于结构化文档,对于非结构化文档和半结构化文档,它能处理,但是有一定的缺陷,那么什么又是结 ...
- VSCode 前端必备插件
VSCode 前端必备插件 Debugger for Chrome 让 vscode 映射 chrome 的 debug功能,静态页面都可以用 vscode 来打断点调试 { "versio ...
- [转载]压力测试工具siege的用法
压力测试工具siege 原文:http://blog.csdn.net/qingye2008/article/details/34500949 Siege是Linux下的一个web系统的压力测试工具, ...
- Visual Studio Code 配置Go 开发环境最简单的方法!!!
由于大家都知道的原因,在国内如果想访问go等各种资源,都会遇到某种不可预知的神奇问题.导致在VS Code中安装 go 各种插件都会失败. 于是乎,网上就出现了各种各样的解决方案:什么手动git cl ...
- 剑指offer-用两个栈实现队列05
class Solution: def __init__(self): self.stackpush=[] self.stackpop=[] def push(self, node): # write ...
- python第三天(list,元组,dictionary)
1.list 列表 列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现. 列表的数据项不需要具有相同的类型 创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可.如下 ...