java版 eval函数实现

今天在一本书上看到eval(String str)函数,它是javascript的一个函数,其作用是执行str这个字符串包含的内容。如:
var stra=textbox_name.value+".value=10;";

把一个textbox_name的value和字符串组成一个新的字符串,假如其值是abc。那么将有一下结果:
str="abc.value=10;";

需要把这个字符串变成一个执行语句,使abc的值是10,那么需要执行下列语句:
eval(str);

这样,这个字符串就变成了表达式或语句,开始执行了。在javascript中,这样的功能有时候非常有用,对于动态构造变量是很有意义的。
其实。对于java而言,也同样会遇到这样的一个需求,例如下面的情况.
public void callClassMethod(int id){
TheClass tc = new ThisClass();
if(id==1){
tc.method_1();
}
if(id==2){
tc.method_2();
}
if(id==3){
tc.method_3();
}
}


如果在TheClass中有 100个方法呢?这样写程序实在太麻烦了,如果能这样实现的话,那是多么美妙的事情。
public void callClassMethod(int id){
TheClass tc=new ThisClass()p
eval(tc.methd_"+id+"()");
}

那怎么去实现这个eval()函数呢,这个时候就要用到“动态编译”技术了,下面是一个例子程序。

import java.io.File;
import java.io.PrintWriter;
import java.io.FileWriter;
import java.lang.reflect.*;

public class Javact{
public static void main(String[] args){
Javact jc=new Javact();
jc.eval("input_str");
}
Public static void eval(String str){
System.out.println(System.getProperty("user.dir"));
String s="class Temp{";
s+=" public static String call(String[] ss){";
s+=" System.out.println(\""+str+"\")'";
s+=" return \"return str\";";
s+="}";
s+="}";

try{
File f=new FIle(Temp.java);
PrintWriter pw=new PrintWriter(new FileWriter(f));
pw.println(s);
pw.close();

//动态编译
com.sun.tools.javac.Main javac=new com.sun.tools.javac.Main();
String[] commadline={"-d",System.getProperty("user.dir"),"Temp.java"};
int status=javac.compile(commadline);
if(status!=0){
System.out.println("没有成功编译源文件");
}
}catch(Exception e){

}try{
Class cls=Class.forName("Temp");
//映射call方法
method call=cls.getMethod("call",new Class[]{String[].class});
//执行call方法
System.out.println(call.invoke(null,new Object[]{new String[0]}));
}catch(Exception se){
}

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java中没有内置的eval函数eval函数通常用于动态执行字符串形式的代码。但是,你可以使用Java的反射机制来实现类似的功能。反射机制允许在运行时动态地加载、检查和调用类、方法和属性。 要实现类似eval函数的功能,你可以使用以下步骤: 1. 将要执行的代码作为字符串传递给eval函数。 2. 使用Java的反射机制加载对应的类。 3. 使用反射获取要执行的方法或属性。 4. 使用反射调用方法或获取属性的值。 下面是一个简单的示例代码,演示了如何使用反射执行字符串形式的代码: ```java import java.lang.reflect.Method; public class EvalExample { public static void main(String[] args) throws Exception { String code = "System.out.println(\"Hello, World!\");"; // 使用反射加载对应的类 Class<?> clazz = EvalExample.class; // 使用反射获取要执行的方法 Method method = clazz.getMethod("eval", String.class); // 使用反射调用方法 method.invoke(null, code); } public static void eval(String code) { // 执行传入的代码 try { // 使用Java的动态编译器执行代码 Class<?> clazz = new JavaCompiler().compile(code); clazz.getMethod("run").invoke(clazz.newInstance()); } catch (Exception e) { e.printStackTrace(); } } } ``` 在上面的示例中,我们定义了一个eval方法,该方法接受一个字符串形式的代码作为参数。在eval方法内部,我们使用了Java的动态编译器来执行传入的代码。 请注意,动态执行代码是一项高级功能,需要谨慎使用。在实际开发中,应该避免直接执行用户输入的代码,以防止安全漏洞和潜在的恶意行为。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值