原理:JS脚本可以通过eval("") 直接执行一段字符串代码,使用 Java 内嵌脚本技术在代码中运行JS脚本得到结果
要求:JDK6 以上版本支持
Java 在不知道参数类型,计算方法的情况,对两个参数进行数学运算,但是利用执行 JS 脚本是一个笔记简单的方法。
- 拼接运算字符串,例如 “ 3 * 6 ”
- 根据名称“javascript”创建JS脚本引擎
- 运行 evla("3 * 6") 得到结果
- 默认是 Double 类型,可以根据要求返回指定的结果类型,但是不能超过类型的大小
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
/**
* @author YanLiang
*
*/
public class ObjectMath {
/**
* 不需要实例化
*/
private ObjectMath() {
}
/**
* @author yan.liang
* @date 2015年8月18日 下午9:27:33
* @Description 任意类型的数值计算
* @param valueA 入参A的值
* @param valueB 入参B的值
* @param mathTypeStr 计算规则,加减乘除等
* @param resultType 返回值类型
*
* @return 计算结果
* @throws ScriptException
*/
public static Object calculateObject(Object valueA, Object valueB,
String mathTypeStr, String resultType) throws ScriptException {
/* 拼接计算字符串 */
String scriptStr = valueA.toString() + " " + mathTypeStr + " "
+ valueB.toString();
/* 使用JS脚本引擎执行 */
ScriptEngineManager sem = new ScriptEngineManager();
ScriptEngine sEngine = sem.getEngineByName("javascript");
Double scriptStrResult = (Double) sEngine.eval(scriptStr);
/* 判断返回值的类型 */
if ("int".equals(resultType)
&& Integer.MIN_VALUE < Math.round(scriptStrResult)
&& Math.round(scriptStrResult) < Integer.MAX_VALUE) {
return (int)Math.round(scriptStrResult);
} else if ("long".equals(resultType)) {
return Math.round(scriptStrResult);
}
return scriptStrResult;
}
/**
* @author yan.liang
* @throws ScriptException
* @date 2015年8月18日 下午9:10:04
* @Description 基本类型加减乘除
*/
public static void main(String[] args) throws ScriptException {
/* 入参 */
Object a = "1";
Object b = 4;
String resultType1 = "int";
Object c = "4096";
String mathType = "*";
String resultType2 = "long";
/* 计算( 1 * 4 * 4096 )*/
System.out.println(ObjectMath.calculateObject(
ObjectMath.calculateObject(a, b, mathType, resultType1), c,
mathType, resultType2));
}
}