操纵Java字节代码.doc

操纵Java字节代码.doc

ID:59204700

大小:37.51 KB

页数:6页

时间:2020-10-30

操纵Java字节代码.doc_第1页
操纵Java字节代码.doc_第2页
操纵Java字节代码.doc_第3页
操纵Java字节代码.doc_第4页
操纵Java字节代码.doc_第5页
资源描述:

《操纵Java字节代码.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、动态编译Java源文件在一般情况下,开发人员都是在程序运行之前就编写完成了全部的Java源代码并且成功编译。对有些应用来说,Java源代码的内容在运行时刻才能确定。这个时候就需要动态编译源代码来生成Java字节代码,再由JVM来加载执行。典型的场景是很多算法竞赛的在线评测系统(如PKUJudgeOnline),允许用户上传Java代码,由系统在后台编译、运行并进行判定。在动态编译Java源文件时,使用的做法是直接在程序中调用Java编译器。JSR199引入了Java编译器API。如果使用JDK6的话,可以通过此API来动态编译Java代码。比如下面的代码用来动态编译最简单的He

2、lloWorld类。该Java类的代码是保存在一个字符串中的。publicclassCompilerTest{publicstaticvoidmain(String[]args)throwsException{Stringsource="publicclassMain{publicstaticvoidmain(String[]args){System.out.println("HelloWorld!");}}";JavaCompilercompiler=ToolProvider.getSystemJavaCompiler();StandardJavaFileManagerf

3、ileManager=compiler.getStandardFileManager(null,null,null);StringSourceJavaObjectsourceObject=newCompilerTest.StringSourceJavaObject("Main",source);IterablefileObjects=Arrays.asList(sourceObject);CompilationTasktask=compiler.getTask(null,fileManager,null,null,null,file

4、Objects);booleanresult=task.call();if(result){System.out.println("编译成功。");}}staticclassStringSourceJavaObjectextendsSimpleJavaFileObject{privateStringcontent=null;publicStringSourceJavaObject(Stringname,Stringcontent)??throwsURISyntaxException{super(URI.create("string:///"+name.replace('.','

5、/')+Kind.SOURCE.extension),Kind.SOURCE);this.content=content;}publicCharSequencegetCharContent(booleanignoreEncodingErrors)??throwsIOException{returncontent;}}}如果不能使用JDK6提供的Java编译器API的话,可以使用JDK中的工具类com.sun.tools.javac.Main,不过该工具类只能编译存放在磁盘上的文件,类似于直接使用javac命令。另外一个可用的工具是EclipseJDTCore提供的编译器。这是E

6、clipseJava开发环境使用的增量式Java编译器,支持运行和调试有错误的代码。该编译器也可以单独使用。Play框架在内部使用了JDT的编译器来动态编译Java源代码。在开发模式下,Play框架会定期扫描项目中的Java源代码文件,一旦发现有修改,会自动编译Java源代码。因此在修改代码之后,刷新页面就可以看到变化。使用这些动态编译的方式的时候,需要确保JDK中的tools.jar在应用的CLASSPATH中。下面介绍一个例子,是关于如何在Java里面做四则运算,比如求出来(3+4)*7-10的值。一般的做法是分析输入的运算表达式,自己来模拟计算过程。考虑到括号的存在和运算

7、符的优先级等问题,这样的计算过程会比较复杂,而且容易出错。另外一种做法是可以用JSR223引入的脚本语言支持,直接把输入的表达式当做JavaScript或是JavaFX脚本来执行,得到结果。下面的代码使用的做法是动态生成Java源代码并编译,接着加载Java类来执行并获取结果。这种做法完全使用Java来实现。privatestaticdoublecalculate(Stringexpr)throwsCalculationException {StringclassName="Calculat

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。