社区
Java SE
帖子详情
java中有没有像js中eval函数的方法?
cmengzhongren
2006-06-30 11:43:02
有一个字符串“4+3”我在java中怎么能执行4+3得到7呢
...全文
758
12
打赏
收藏
java中有没有像js中eval函数的方法?
有一个字符串“4+3”我在java中怎么能执行4+3得到7呢
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Student02370236
2006-06-30
打赏
举报
回复
在JAVA中用反射可以实现类似的功能
dreamover
2006-06-30
打赏
举报
回复
没有
那种函数只可能出现在解释执行的脚本语言里
trumplet
2006-06-30
打赏
举报
回复
protected String getOPTS() {
return OPTS;
}
protected boolean isValue(String cValue){
String notValue=this.getOPTS()+"()";
return notValue.indexOf(cValue)==-1;
}
protected boolean isOpt(String value){
return this.getOPTS().indexOf(value)>=0;
}
protected double calValue(String value1,String opt,String value2) throws ExpressionException{
try {
double dbValue1=Double.valueOf(value1).doubleValue();
double dbValue2=Double.valueOf(value2).doubleValue();
long lg=0;
if(opt.equals("+")){
return dbValue1+dbValue2;
} else if(opt.equals("-")){
return dbValue1-dbValue2;
} else if(opt.equals("*")){
return dbValue1*dbValue2;
} else if(opt.equals("/")){
return dbValue1/dbValue2;
} else if(opt.equals("%")){
lg=(long)(dbValue1/dbValue2);
return dbValue1-lg*dbValue2;
} else if(opt.equals(">")){
if(dbValue1>dbValue2)
return 1;
else
return 0;
} else if(opt.equals("<")){
if(dbValue1<dbValue2)
return 1;
else
return 0;
} else if(opt.equals("]")){
if(dbValue1>=dbValue2)
return 1;
else
return 0;
} else if(opt.equals("[")){
if(dbValue1<=dbValue2)
return 1;
else
return 0;
} else if(opt.equals("!")){
if(dbValue1!=dbValue2)
return 1;
else
return 0;
} else if(opt.equals("|")){
if(dbValue1>0||dbValue2>0)
return 1;
else
return 0;
} else if(opt.equals("&")){
if(dbValue1>0&&dbValue2>0)
return 1;
else
return 0;
} else if(opt.equals("=")){
if(dbValue1==dbValue2)
return 1;
else
return 0;
}
}catch(Exception e) {
throw new ExpressionException("值"+value1+"或"+value2+"在进行"+ opt+"运算时非法!");
}
throw new ExpressionException("运算符"+opt+"非法!");
}
protected String getValue(String oldValue) throws ExpressionException{
String reg="^([a-zA-Z0-9_]+)\\(([a-zA-Z0-9_.()]+)\\)$";
if(this.isFunctionCal(oldValue)){
Pattern p=Pattern.compile(reg);
Matcher m=p.matcher(oldValue);
m.find();
return calFunction(m.group(1),m.group(2));
}
return oldValue;
}
protected boolean isFunctionCal(String value){
String reg="^([a-zA-Z0-9_]+)\\(([a-zA-Z0-9_.()]+)\\)$";
return value.matches(reg);
}
protected String calFunction(String function,String value) throws ExpressionException{
String lowerFun=function.toLowerCase();
double db=0;
try {
db=Double.valueOf(this.getValue(value)).doubleValue();
if(lowerFun.equals("log")){
return String.valueOf(Math.log(db));
} else if(lowerFun.equals("square")){
return String.valueOf(Math.pow(db,2));
} else if(lowerFun.equals("sqrt")){
return String.valueOf(Math.sqrt(db));
} else if(lowerFun.equals("sin")){
return String.valueOf(Math.sin(db));
} else if(lowerFun.equals("asin")){
return String.valueOf(Math.asin(db));
} else if(lowerFun.equals("cos")){
return String.valueOf(Math.cos(db));
} else if(lowerFun.equals("tan")){
return String.valueOf(Math.tan(db));
} else if(lowerFun.equals("atan")){
return String.valueOf(Math.atan(db));
} else if(lowerFun.equals("ceil")){
return String.valueOf(Math.ceil(db));
} else if(lowerFun.equals("exp")){
return String.valueOf(Math.exp(db));
}
}catch(Exception e) {
throw new ExpressionException("函数"+function+"值"+value+"非法!");
}
throw new ExpressionException("函数"+function+"不支持!");
}
public static void main(String[]args) {
Eval be=new Eval();
//String exp="sin(ceil(100))*29+20+30*3+0|0|1+1&1*5+2=2";
//String exp="sin(ceil(sqrt(100)))*29+20+30*3+0|0|1+1&1*5+2=2";
String exp="8/(3-8/3)";
try {
System.out.println(be.calculate(exp));
} catch(ExpressionException eE) {
System.out.println(eE.getMessage());
}
}
//表达式异常类代码:
public class ExpressionException extends Exception{
public ExpressionException(String msg) {
super(msg);
}
}
}
trumplet
2006-06-30
打赏
举报
回复
代码太长,分两部分贴上
package mathTools;
/**
* Eval.java
*
* Created on 2006年4月10日, 下午3:46
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*
* 支持运算符:+ - * / % > < ] [ ! | & =
* 其中:
* ] 表示大于等于
* [ 表示小于等于
* ! 表示不等于
* | 表示或
* & 表示与
* = 表示是否等于
*
* 支持函数:sqrt,square,ceil,sin,cos,asin,acon.tan.atan,log,exp 具体含义见 calFunction 代码
*
*/
/**
*
* @author Trumplet
*
*/
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Eval{
public static String OPTS="+-*/%><][!|&=#";
public Object calculate(String expression) throws ExpressionException{
try {
Stack Opts=new Stack();
Stack Values=new Stack();
String exp=expression+"#";
int nCount=exp.length(),nIn,nOut,nTemp;
Opts.push("#");
String temp="",optOut="",optIn="",value1="",value2="",optTemp="",opt="",temp1="";
int nFun=0;
boolean isFun=false;
for(int i=0;i<nCount;){
nTemp=0;
opt=exp.substring(i,i+1);
isFun=false;
temp1="";
while(i<nCount){
if(!temp1.equals("")){
if(opt.equals("(")){
nFun++;
isFun=true;
} else if(opt.equals(")")){
nFun--;
}
}
if((nFun>0)||((!isFun)&&this.isValue(opt))){
temp1+=opt;
nTemp++;
opt=exp.substring(i+nTemp,i+nTemp+1);
} else{
if(isFun){
temp1+=opt;
nTemp++;
}
break;
}
}
if(temp1.equals("")){
temp=opt;
} else{
temp=temp1;
}
if(nTemp>0){
i=i+nTemp-1;
}
temp=temp.trim();
if(this.isValue(temp)){
temp=this.getValue(temp);
Values.push(temp);
i++;
} else{
optIn=Opts.pop().toString();
nIn=this.getOptPriorityIn(optIn);
nOut=this.getOptPriorityOut(temp);
if(nIn==nOut){
i++;
} else if(nIn>nOut){
String ret="";
value1=Values.pop().toString();
value2=Values.pop().toString();
ret=String.valueOf(this.calValue(value2,optIn,value1));
Values.push(ret);
} else if(nIn<nOut){
Opts.push(optIn);
Opts.push(temp);
i++;
}
}
}
return Values.pop();
} catch(ExpressionException eE) {
throw eE;
} catch(Exception e) {
throw new ExpressionException("表达式"+expression+"格式非法!");
}
}
protected int getOptPriorityOut(String opt)throws ExpressionException{
if(opt.equals("+")){
return 1;
} else if(opt.equals("-")){
return 2;
} else if(opt.equals("*")){
return 5;
} else if(opt.equals("/")){
return 6;
} else if(opt.equals("%")){
return 7;
} else if(opt.equals(">")){
return 11;
} else if(opt.equals("<")){
return 12;
} else if(opt.equals("]")){
return 13;
} else if(opt.equals("[")){
return 14;
} else if(opt.equals("!")){
return 15;
} else if(opt.equals("|")){
return 16;
} else if(opt.equals("&")) {
return 23;
} else if(opt.equals("=")) {
return 25;
} else if(opt.equals("#")) {
return 0;
} else if(opt.equals("(")){
return 1000;
} else if(opt.equals(")")){
return -1000;
}
throw new ExpressionException("运算符"+opt+"非法!");
}
protected int getOptPriorityIn(String opt) throws ExpressionException{
if(opt.equals("+")){
return 3;
} else if(opt.equals("-")){
return 4;
} else if(opt.equals("*")){
return 8;
} else if(opt.equals("/")){
return 9;
} else if(opt.equals("%")){
return 10;
} else if(opt.equals(">")){
return 17;
} else if(opt.equals("<")){
return 18;
} else if(opt.equals("]")){
return 19;
} else if(opt.equals("[")){
return 20;
} else if(opt.equals("!")){
return 21;
} else if(opt.equals("|")){
return 22;
} else if(opt.equals("&")) {
return 24;
} else if(opt.equals("=")) {
return 26;
} else if(opt.equals("(")){
return -1000;
} else if(opt.equals(")")){
return 1000;
} else if(opt.equals("#")){
return 0;
}
throw new ExpressionException("运算符"+opt+"非法!");
}
cmengzhongren
2006-06-30
打赏
举报
回复
有人说用堆栈可以实现,堆栈怎么用?
cmengzhongren
2006-06-30
打赏
举报
回复
找不到啊,哪位找到了给共享一下吧
trumplet
2006-06-30
打赏
举报
回复
早已有高人写过这个了,google一下就有了
Student02370236
2006-06-30
打赏
举报
回复
因为JAVA是一个面向对象的语言,我想象JS中的那种功能放到JAVA中不太适合.在JAVA中,语句都是在某一个类之中的,没有独立的语句存在.因此我想这种功能不会在JAVA API中出现,当然,这只是我的想法,未来的事情谁都说不清楚...
Student02370236
2006-06-30
打赏
举报
回复
在JAVA中我还没有见过类似Javascript中eval的这种功能除非自己写一个组件来实现,我说的用反射进行就是下面的代码.
import java.lang.reflect.*;
public class ReflactTest{
public static void main(String[] args){
try{
Class addClass=Class.forName("AddTest");
Method[] method=addClass.getMethods();
System.out.println(method[0].invoke(new AddTest(),new Object[]{3,4}));
} catch (Exception e){
e.getMessage();
}
}
}
class AddTest{
private int add1;
private int add2;
public AddTest(){}
public int add(int add1,int add2){
return add1+add2;
}
}
cmengzhongren
2006-06-30
打赏
举报
回复
请问用反射怎么实现,能不能举个简单的例子?其他的例子也行,谢谢!
chenmingjsw
2006-06-30
打赏
举报
回复
楼上的高手,你自己会做吗?怎么不把答案写出来呢?:)
帮楼主顶!
whyxx
2006-06-30
打赏
举报
回复
没有,我们公司今年培训新人,最后的考查题就是写一个这个,呵呵.
java
实现
eval
函数
在
Java
编程语言
中
,`
eval
`
函数
通常与
Java
Script关联,因为
Java
Script有一个内置的`
eval
`
函数
,它能够解析并执行一个字符串作为
Java
Script代码。然而,
Java
本身并不直接提供类似的功能。`
eval
`
函数
在
Java
中
并不是标准...
java
实现
js
中
eval
功能
在
Java
中
,没有直接对应的内置
函数
可以实现这样的功能,但我们可以构建一个类似的机制来模拟`
eval
()`的行为。 首先,我们需要理解`
eval
()`的核心功能:将字符串转换为可执行的代码。在
Java
中
,这可以通过编译和执行...
java
script
中
eval
函数
用法分析
本文实例分析了
java
script
中
eval
函数
用法。分享给大家供大家参考。具体分析如下:
eval
()只有一个参数,如果传入的参数不是字符串,则直接返回这个参数。否则会将字符串当成
js
代码进行编译,如果编译失败则...
(
java
调用
js
__
方法
.docx
Java
调用
JS
方法
有很多优点,例如: * 提高了开发效率:
Java
调用
JS
方法
可以使得开发者可以轻松地使用
Java
Script 代码,提高了开发效率。 * 提高了代码重用性:
Java
调用
JS
方法
可以使得开发者可以重用 ...
深入认识
java
script
中
的
eval
函数
1)介绍
java
script
中
的
eval
函数
的用法 (2)如何在
函数
内执行全局代码 ►先来说
eval
的用法,内容比较简单,熟悉的可以跳过。
eval
函数
接收一个参数s,如果s不是字符串,则直接返回s。否则执行s语句。如果s语句执行...
Java SE
62,635
社区成员
307,269
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章