概述
今天看到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>
最后
以上就是敏感小鸽子为你收集整理的bsh.jar的使用的全部内容,希望文章能够帮你解决bsh.jar的使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复