我是靠谱客的博主 敏感小鸽子,这篇文章主要介绍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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<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内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部