`
liuwei_blog
  • 浏览: 94413 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

    博客分类:
  • java
阅读更多

我们知道,在很多脚本语言中都有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的语句来执行.
  本文只是一个例子,说明了一个动态编译的思想,更好的实现请各位朋友自己来完成.

分享到:
评论

相关推荐

    java实现eval函数

    但是,如果你需要在Java中实现类似的功能,可以创建一个自定义的解析器或利用一些第三方库来解析和执行给定的字符串。 在Java中模拟`eval`功能的一个常见方法是通过使用Java Scripting API(JSR 223),它允许你在...

    java解析公式 eval.jar

    使用`eval.jar`库,开发者可以轻松地在Java程序中构建动态计算功能,无需编写复杂的解析代码。这在数据分析、科学计算、游戏逻辑或者任何需要根据用户输入计算结果的场景中都非常有用。以下是一些关键知识点: 1. *...

    编译原理实验(基于表达式的计算器ExprEval)

    在ExprEval中,根节点可能是表达式,子节点可以是操作符和操作数。AST有助于简化后续的语义分析和代码生成。 4. **语义分析(Semantic Analysis)**: 这一步检查程序的逻辑正确性,例如类型检查和作用域分析。...

    JavaREPL是一个Java语言读入-求值-打印-循环(Read-Eval-Print-Loop)功能实现

    JavaREPL,全称为Java Read-Eval-Print Loop,是Java开发者的一种实用工具,它允许程序员在交互式环境中测试代码片段、快速实验新概念或调试程序。REPL是许多编程语言的标准特性,如Python和Lisp,而在Java世界中,...

    java动态代码执行

    Java动态代码执行是一种在运行时编译和执行代码的技术,它可以极大地提高程序的灵活性和可扩展性。在Java中,Groovy是一个强大的脚本语言,它与Java语法兼容,并且可以无缝集成到Java应用程序中,使得动态代码执行变...

    java调用js代码实现动态配置

    通过上述示例我们可以看到,Java 调用 JavaScript 实现动态配置是一种非常实用的技术手段,它可以帮助我们在不重启服务的情况下更改算法或业务逻辑。然而,在实际应用中还需要考虑到安全性、性能等因素,确保系统的...

    在Java中运行Perl脚本 JERL

    你需要下载JERL的源码包,例如你提到的"jerl",并使用Java的javah工具生成C接口头文件,接着使用C编译器编译源码,最后将生成的动态链接库文件(如.dll或.so)加入到Java的系统类路径中。 **使用JERL** 在Java中,...

    Z.Expressions.Eval.2.4.2

    总的来说,Z.Expressions.Eval 2.4.2 是一个强大且灵活的库,为Java开发者提供了便捷的表达式处理工具,使得在各种项目中实现自定义计算逻辑变得更加简单和高效。通过深入理解和熟练运用,你可以利用它的功能来提升...

    JavaRunWeb:基于springboot + maven的可在线动态解析编译Java代码的学习系统,作为学生可以进行编程练习,考试作答,课件观看和视频学习的功能,老师可对学习资源进行管理,也可查看学生做题情况分和可题的做题对错记录,并且将学生分数和每道题的对错情况以图表的形式呈现给老师

    在JavaRunWeb系统中,动态解析和编译Java代码的能力是其核心特性之一。这通常涉及到Java的JShell(也称为REPL,Read-Eval-Print Loop)或者自定义的Java编译器接口。这样的功能允许学生实时测试代码,获取即时反馈,...

    Java反编译工具和关系型数据库建模工具

    在实际应用中,Java反编译工具和数据库建模工具常常结合使用。例如,当我们需要修改一个使用特定框架的Java应用,可以先用反编译工具解析框架的内部机制,然后根据业务需求调整数据库模型,最后利用建模工具生成相应...

    Java中使用MATLAB作图

    为了在Java项目中利用MATLAB的绘图功能,我们可以借助MATLAB的Java API或者通过调用MATLAB可执行文件来实现。以下将详细介绍如何在Java中使用MATLAB进行作图。 1. **MATLAB Compiler SDK**: MATLAB Compiler SDK...

    java调用脚本语言笔记(jython,jruby,groovy)

    Java调用Jython、JRuby和Groovy提供了强大的动态编程能力,使得开发者可以在Java应用中充分利用这些脚本语言的优点。了解如何在Java中正确地调用和管理这些脚本,对于提升开发效率和应用功能都有很大帮助。在实际...

    Java命令行实现简单的计算器

    在实现这个计算器程序的过程中,你将学习到如何在命令行下与用户交互,如何解析和处理复杂的数学表达式,以及如何在Java中实现错误处理。这是一项有助于提升你编程技能的练习,同时也会让你对Java的面向对象编程有更...

    05-python-修饰符的使用-operator模块-作用域-动态编译

    在Python编程语言中,了解和熟练使用修饰符、`operator`模块、作用域以及动态编译是提升代码效率和质量的关键。这篇学习笔记将深入探讨这些主题,帮助你更好地掌握Python编程的核心概念。 首先,我们来看看修饰符。...

    java_call_matlab.zip_JAVA调用matlab_java 调用matlab_java-matlab

    Java调用MATLAB是软件开发中的一个常见需求,特别是在数据处理、科学计算或者算法实现时,MATLAB的强大功能经常被需要融入到Java应用程序中。这个`java_call_matlab.zip`压缩包显然包含了关于如何在Java中调用MATLAB...

    Java实现计算字符串表达式

    在Java编程语言中,计算字符串表达式是一项常见的任务,它涉及到解析、编译和执行包含数学运算符和操作数的字符串。这篇博客“Java实现计算字符串表达式”可能讲解了如何利用Java来处理这种问题,虽然具体的实现细节...

    效率非常快的java读取javascript,附带源码和js.jar

    Rhino是由Mozilla开发的一个开源的JavaScript引擎,它完全用Java编写,能够将JavaScript代码编译为Java字节码,从而使得JavaScript能够在Java平台上高效运行。这个“效率非常快的java读取javascript”很可能就是基于...

    Java 链接 R 软件的一个例子

    在这个例子中,我们将探讨如何在Java中调用R软件,这通常被称为"Java-R互操作性"。这个话题对于那些需要利用Java的强大功能和R的统计计算与图形生成能力的开发者来说尤为重要。 首先,Java-R互操作性的实现主要依赖...

    java脚本 快速学习

    在Java中,脚本主要指的是使用ScriptEngine接口来执行的代码片段,可以嵌入到应用程序中,实现快速的原型开发或者自动化任务。 一、Java Scripting API(JSAPI) JSAPI是Java平台标准版(Java SE)的一部分,它...

Global site tag (gtag.js) - Google Analytics