java 动态编译cpp,在java中利用动态编译实现eval

我们知道,在很多脚本语言中都有eval涵数,它可以把字符串转换为表态式并执行.如在javaScript中

var str = aid.value + ".style.top = 10;"

把一个id为"aid"的控制的值取出来加合并成一个字符串,如果aid的值是"axman",则

str = "axman.style.top = 10"

现在我们要让控制axman移动到顶部为10的位置:

eval(str);

这样这个字符串就变成了表达式或语句开始执行.这样的功能对于动态构造变量是有非常重要的

意义.

那么在java中,如果实现这个功能呢?其实我们可以用动态编译来实现:

假设有一组方法实现不同的功能,现在要根据传进来的方法名调用相应的方法,假如没有eval功能,我们

只能这么做:

MyClass mc = new MyClass();

if(str.equals("m1"))

mc.m1();

else if(str.equals("m1"))

mc.m2();

else if(str.equals("m3"))

mc.m3();

else if(.........)

.........();

如果有一百种情况呢?

如果我们用eval方法就可以直接这样:

String str = ...........;

eval("mc"+str+"();");

是不是非常方便?关键是如何实现eval()?

经过几个小时的网上搜索和研究终于找到了方法,现在拿出来和大家分享下

接着运行以下程序即可看到效果

import bsh.Interpreter;

import java.util.*;

public class testBshInterpreter

{

public  static void main(String args[]) throws Exception

{

Interpreter interpreter= new Interpreter();

//String bStr="(100>50 && 100<101)";

try

{

//1

interpreter.set("add", interpreter.eval("(100+101)"));

System.out.println(interpreter.get("add"));

interpreter.set("boolean", interpreter.eval("(100>101)"));

System.out.println(interpreter.get("boolean"));

//2

Interpreter i = new Interpreter(); // Construct an interpreter

i.set("foo", 5); // Set variables

i.set("date", new Date() );

Date date = (Date)

i.get("date"); // retrieve a variable

// Eval a statement and get the result

i.eval("bar = foo*10");

System.out.println( i.get("bar") );

String[] s ={"getname","getname1"};

for(int j=0;j

i.eval("result = testBshInterpreter."+s[j]+"()");

System.out.println(i.get("result"));

}

}

catch (Exception e)

{

e.printStackTrace();

}

}

public static String getname(){

return "haha";

}

public static String getname1(){

return "HOHO";

}

}

说明:此程序大部分是从网上COPY来,本人主要写了2个方法和System.out.println(i.get("result"));

的这部分,也是我在做程序时所遇到的一个难题,原来想的办法是和一开始写的方法一样,但觉得太复杂且运行效率不高,便开始寻找解决方法,虽然话了几个小时,可是还是比较值的

15548438_2.gif

显示结果为:

201

false

50

haha

HOHO

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值