bsh.jar的使用

来源:互联网 发布:socket网络通信流程图 编辑:程序博客网 时间:2024/06/05 12:50

今天看到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.9System.out.println("计算结果:"+ fp.caculateByFormula(fp.loadFormula("1001"), paras));//遵照公式1001计算,计算预期结果为90.0FormulaParser 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>




 

 

原创粉丝点击