在线用户    站点地图 技术论坛 文档中心 站点导航 资源下载 语言参考 教程专题 站点统计 业务项目 使用帮助
您的位置
MSDN参考新加了CSS2参考,全中文,制作精良。245k下载。           新加了sxf_sxf推荐的"动态网页专家指导" 下载!          新加了lsg2002lsg推荐的"ASP.NET高级编程(PDF)" 下载!          新加了DHTML代码预览!!,功能强大哦!欢迎试用          新加了网友lincong为大家提供的SQL Server 2000 程序员指南,有点大,但同时也就说明内容全咯!           新加了网友ibra为大家提供的北大的JAVA课件,很适合初学者入门           新加了一个java的连接缓冲池代码示例           新加了人月神话电子版下载!软件工程巨著哦~~           更新了评分标准,引入了“专家分”概念,相信可以更好的激励大家的学习!详情请看“使用帮助”           新加了由网友GGG提供的“IIS超级管理手册”,值得一看哦!(虽然我没看过 :P )           新加了“英雄榜”,欢迎测试!           “无组件上传·从原理剖析到实践”已经全部完成,源码全部开放,有兴趣的朋友请到文档中心一探究竟。  您的位置  首页>文档中心>JAVA>文档A0000852 在同一窗口中打开页面中的链接 在新窗口中打开页面中的链接 将ASPCHINA设为首页 将ASPCHINA加入书签    
 LOGIN HERE
用户:
密码: 忘记密码
记住密码 用户注册 游客进入
相关文章

24点游戏的通用解法例程
发表文章
在java中利用动态编译实现eval

原作者:axman     提交人:firefly     发布时间:04-12-01     文章类型:转贴     浏览量:4062
参考链结:http://blog.csdn.net/axman/    
关键字:eval|动态编译
[本文档没有附件]
字体:    视力保护色: 杏仁黄  秋叶褐  胭脂红  芥末绿  天蓝  雪青  灰  银河白(默认色) [A0000852]

我们知道,在很多脚本语言中都有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()?

我们把要转换的字符串构造一个完整的类:如果方法是有返回值的.则:

public Object eval(String str){
  //生成java文件
  String s = "class Temp{";
s += "Object rt(){"
s += "MyClass mc = new MyClass();"
        s += " return mc."+str+"();";
        s += "}"
s +="}";
  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[] cpargs = new String[] {"-d", "所在目录","Temp.java"};
  int status = javac.compile(cpargs);
  if(status!=0){
      System.out.println("没有成功编译源文件!");
      return null;
  }
  //调用Temp的rt方法返回结果:
  MyClassLoader mc = new MyClassLoader();
  Class clasz = mc.loadClass("Test.class",true);
  Method rt = clasz.getMethod("rt", new Class[]{ String[].class });
  return rt.invoke(null, new Object[] { new String[0] });
  //如果方法没有返回就直接调用
}

我们可以先写好多个重载的eval,有返回值和没有返回值的.以及可以传递参数的.

这样我们就可以用字符串转换为java的语句来执行.

本文只是一个例子,说明了一个动态编译的思想,更好的实现请各位朋友自己来完成.

关于这篇文章的评论 [注意:这里仅仅是给大家提供了一个发表对文章本身看法的地方,如果有疑问,请到论坛提出] 我要提问!
标题
内容
发言
*您尚未以注册用户身份登录,不能发表评论。这里登录
您的位置
  (c)2000-2021 Yup Studio, all rights reserved.  
72.26563