bsh.jar的使用

今天看到jar里面有个bsh.jar。不知掉什么用的,所以百度了一下。大体上了解到bsh.jar就是一个用字符串来描述java代码,然后可以运行这些字符串。

bsh.jar双击后可以运行,类似一个命令提示符窗口,你在这里可以试验你的字符串。例如;

int a=13;

int b=12;

print(13+12);

你就可以看到打印出了25;

 

http://www.ibm.com/developerworks/cn/java/l-formula/这篇文章,告诉你如何应用bsh.jar。我补全他未贴出的代码,然后运行了一下。

目录结构如图

Main.java

import java.util.Hashtable;
import java.util.Iterator;
import java.util.Vector;

import parse.FormulaParser;

import bsh.Interpreter;


public class Main {
	public static void main(String[] args) {
		FormulaParser fp= new FormulaParser();
		Hashtable paras= new Hashtable();
		paras.put("price", new Double(100.0));
		paras.put("discount", new Double(0.9));
		//折扣率为0.9
		System.out.println("计算结果:"+ fp.caculateByFormula(fp.loadFormula("1001"), paras));
		//遵照公式1001计算,计算预期结果为90.0
		FormulaParser fp1= new FormulaParser();
		Hashtable paras1= new Hashtable();
		paras1.put("sale", new Double(11000.0));
		//销售额
		paras1.put("score", new Double(0.8));
		//表现得分
		System.out.println("计算结果:"+ fp1.caculateByFormula(fp1.loadFormula("1002"), paras1));
		// 遵照公式1002计算,计算预期结果为9100.0

	}
	
}


 

Formula.java

package model;

import java.util.Vector;

public class Formula {
	public Formula(String script,Vector parameters){
		setScript(script);
		setParameters(parameters);
	}
	private String script;
	private Vector parameters;
	public String getScript() {
		return script;
	}
	public void setScript(String script) {
		this.script = script;
	}
	public Vector getParameters() {
		return parameters;
	}
	public void setParameters(Vector parameters) {
		this.parameters = parameters;
	}
	
}


Calculator.java

package parse;

public class Calculator {

	public static double mutiply(double a,double b){
		return a*b;
	}
	public static double add(double a,double b){
		return a+b;
	}
}

FormulaParser.java

package parse;



import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import model.Formula;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

import bsh.Interpreter;

public class FormulaParser {
	public final static String prefix="src/xml/";
	public double caculateByFormula(Formula formula, Hashtable parameters) {        
		double result=0.0;
		try
		{        
			Interpreter i = new Interpreter(); 
			// 实例化一个BeanShell解释器
			i.eval("import parse.*;");
			//引用公式管理系统
			Vector para= formula.getParameters();
			//获取公式中包含的参数列表
			Iterator it= para.iterator();
			//设置参数值
			while (it.hasNext()){    
				String[] dec= (String[])it.next(); 
				
				String declare= dec[1]+ " "+ dec[0];
				System.out.println(declare);
				i.eval(declare);   
				String value= ((Double)parameters.get(dec[0])).toString();  
				if (value != null){     
					String assign_value= dec[0]+ "="+ value; 
					System.out.println(assign_value);
					i.eval(assign_value);          
				}else{ 
					System.out.println("caculateByFormula():"+ dec[0]+ 
							"参数名不符或改参数不存在");         System.exit(1);          
				}        
			}        
			//参数设置成功,根据公式计算脚本进行计算,仅用了一行代码就完成了求值过程,
			//BeanShell值得你去了解
			i.eval(formula.getScript());
			System.out.println(formula.getScript());
			Double rst= (Double)i.get("result");
			result= rst.doubleValue();        
		}catch(Exception e){ 
			System.out.println("caculateByFormula():"+ e.getMessage());        
		}
		return result;    
	}
	public Formula loadFormula(String formulaID) { 
		Vector paras= new Vector();
	        try{
			SAXBuilder builder= new SAXBuilder();
			Document doc= builder.build(prefix+ "Formulas.xml");
			//prefix是一个字符窜,用来指定公式库实际所在的位置
			Element root= doc.getRootElement();
			List formulas= root.getChildren("formula");
			Iterator it= formulas.iterator();
			Element formula= null;
			while( it.hasNext()){    
				formula= (Element)it.next();
				if(formula.getAttributeValue("id").equals(formulaID)){
					break;
				}       
			}        
			//获取参数列表 
			List parameters= formula.getChild("parameters").getChildren();
			Iterator itp= parameters.iterator();
			while(itp.hasNext()){ 
				String[] s_para= new String[2];
				Element e_para= (Element)itp.next();
				s_para[0]= e_para.getAttributeValue("name");
				s_para[1]= e_para.getAttributeValue("type");
				paras.add(s_para);
			}        
			Element script= formula.getChild("script");
			String s_script= script.getTextTrim();
			return new Formula(s_script, paras);
			//将读出的信息组装成一个公式对象
		}catch(Exception e){ 
			System.out.println("loadFormula():"+ e.getMessage());
	        } 
		return null;
	}

}

Formulas.xml

<formulas>
	<formula id="1001" name="F_DISCOUNT">
		<parameters>
			<parameter type="double" name="price"/>
			<parameter type="double" name="discount"/>
		</parameters>
		<script>result= Calculator.mutiply(price, discount)</script>
	</formula>
	<formula id="1002" name="F_BONUS">
		<parameters>
			<parameter type="double" name="sale"/>
			<parameter type="double" name="score"/>
		</parameters>
		<script>result= Calculator.add(Calculator.mutiply(sale, 0.1),
		Calculator.mutiply(score, 10000))</script> 
	</formula>
</formulas>




 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值