Java 如何直接获得字符串形式计算的结果

原理:JS脚本可以通过eval("") 直接执行一段字符串代码,使用 Java 内嵌脚本技术在代码中运行JS脚本得到结果

要求:JDK6 以上版本支持


Java 在不知道参数类型,计算方法的情况,对两个参数进行数学运算,但是利用执行 JS 脚本是一个笔记简单的方法。

  1. 拼接运算字符串,例如 “ 3 * 6 ”
  2. 根据名称“javascript”创建JS脚本引擎
  3. 运行 evla("3 * 6")  得到结果
  4. 默认是 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));

	}

}


你可能感兴趣的:(java基础)