已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
在程序中实现对java源文件编译的3种方法一般情况下对java源文件的编译均是在代码完成后使用javac编译的,不管是使用 IDE还是直接使用命令行。这里要说的情况是比较特别的,就是在代码内动态的编译一些代码。比如你想通过在某个目录下通过放置一些源代码的方式来实现对程序功能的动态扩展,那么你的程序就需要具有一种对源代码的编译、加载、运行的能力,可能就需要本文介绍的3种方法。方法1:通过调用本机的javac命令来编译。在java程序中调用javac命令可以通过调用Runtime类的exec或是ProcessBuilder类的start方法来完成,这两个类的功能基本相同,用法也比较相似,这里的例子我们就用ProcessBuilder来演示。如果是JDK1.5之前的版本请使用Runtime类完成相同的功能。开始之前先来点准备工作,将下面的类放到 c:mytestsrc 目录下,这个类我们不会在IDE中编译,而是由我们程序完成其编译。保存时使用UTF-8格式。可以直接在附件中下载这个类。Java代码 img/attachments/images/302-icon_copy.gif/imgpublic class HelloWorld public void sayHello(String in) System.out.println(动态编译成功); System.out.println(使用编译方式: + in); public class HelloWorld public void sayHello(String in) System.out.println(动态编译成功); System.out.println(使用编译方式: + in); 准备工作完成,下面就看一下我们程序的代码,这里只列出主要代码Java代码 img/attachments/images/302-icon_copy.gif/imgpublic class JavacCompile private static String filePath = c:mytestsrcHelloWorld.java; private static String binDir = c:mytestbin; public static void main(String args) File binOutDir = new File(binDir); if (!binOutDir.exists() binOutDir.mkdirs(); / 设置javac的编译参数,使用-encoding指定编码方式,-d并指定编译生成class文件目录 ProcessBuilder pb = new ProcessBuilder(javac,-encoding, UTF-8,-d, binDir, filePath); try / 开始调用javac命令编译 final Process proc = pb.start(); / 处理进程的输出,避免挂死 new Thread(new Runnable() public void run() processStream(proc.getInputStream(); processStream(proc.getErrorStream(); ).start(); / 等待编译完成 proc.waitFor(); / 加载编译好的类,并调用相应的方法 new LoaderClassByDir(binDir).execSayHello(javac); catch (Exception ex) Logger.getLogger(JavacCompile.class.getName().log(Level.SEVERE, null, ex); private static void processStream(InputStream stderr) . public class JavacCompile private static String filePath = c:mytestsrcHelloWorld.java; private static String binDir = c:mytestbin; public static void main(String args) File binOutDir = new File(binDir); if (!binOutDir.exists() binOutDir.mkdirs(); / 设置javac的编译参数,使用-encoding指定编码方式,-d并指定编译生成class文件目录 ProcessBuilder pb = new ProcessBuilder(javac,-encoding, UTF-8,-d, binDir, filePath); try / 开始调用javac命令编译 final Process proc = pb.start(); / 处理进程的输出,避免挂死 new Thread(new Runnable() public void run() processStream(proc.getInputStream(); processStream(proc.getErrorStream(); ).start(); / 等待编译完成 proc.waitFor(); / 加载编译好的类,并调用相应的方法 new LoaderClassByDir(binDir).execSayHello(javac); catch (Exception ex) Logger.getLogger(JavacCompile.class.getName().log(Level.SEVERE, null, ex); private static void processStream(InputStream stderr) . LoaderClassByDir类的代码会保含在后面的上传的文件中,因为这里主要介绍完成程序中对java源文件的编译,对于类的加载和运行不多做描述,可以参考LoaderClassByDir类中的简单实现。方法2:使用Sun的tools.jar包时的com.sun.tools.javac.Main类完成对代码的编译。注意这个类的是在tools.jar包里,tools.jar不是标准的Java库,在使用时必须要设置这个jar的路径,使用IDE时需要显示的引入到编译路径中,不然会找不到。我们使用此类改写上面的编译类如下:Java代码 img/attachments/images/302-icon_copy.gif/imgpublic class JavacCompile private static String filePath = c:mytestsrcHelloWorld.java; private static String binDir = c:mytestbin; public static void main(String args) File binOutDir = new File(binDir); if (!binOutDir.exists() binOutDir.mkdirs(); / 将编译参数通过数组传递到编译方法中,该函数的方法和javac的参数完成一致 Mpile(new String-encoding, UTF-8,-d, binDir, filePath); try / 加载编译好的类,并调用相应的方法 new LoaderClassByDir(binDir).execSayHello(sun tools); catch (Exception ex) Logger.getLogger(JavacCompile.class.getName().log(Level.SEVERE, null, ex); public class JavacCompile private static String filePath = c:mytestsrcHelloWorld.java; private static String binDir = c:mytestbin; public static void main(String args) File binOutDir = new File(binDir); if (!binOutDir.exists() binOutDir.mkdirs(); / 将编译参数通过数组传递到编译方法中,该函数的方法和javac的参数完成一致 Mpile(new String-encoding, UTF-8,-d, binDir, filePath); try / 加载编译好的类,并调用相应的方法 new LoaderClassByDir(binDir).execSayHello(sun tools); catch (Exception ex) Logger.getLogger(JavacCompile.class.getName().log(Level.SEVERE, null, ex); 使用这个类后,同样的功能代码变得更加简洁。方法3:使用javax.tools包从上面可以看到方法2的缺点就是tools.jar需要我们自行导入。而在Java SE6中为我们提供了标准的包来操作Java编译器,这就是javax.tools包。使用这个包,我们可以不用将jar文件路径添加到 classpath中了。 使用这个类的方法和上面的类很相似,我只需要将Java代码 img/attachments/images/302-icon_copy.gif/imgMpile(new String-encoding, UTF-8,-d, binDir, filePath); Mpile(new String-encoding, UTF-8,-d, binDir, filePath);替换成:Java代码 img/attachments/images/302-icon_copy.gif/img/ 将编译参数通过数组传递到编译方法中,该函数的方法和javac的参数完成一致 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); compiler.run(null, null, null, -encoding, UTF-8,-d, binDir, filePath); / 将编译参数通过数组传递
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 遮蔽剂调制与涂布工安全知识宣贯竞赛考核试卷含答案
- 煤气净化回收工操作安全测试考核试卷含答案
- 导猎员风险识别竞赛考核试卷含答案
- 模压成型工职业健康技术规程
- 解析领导力影响力
- 教育学论文深度解析
- 教育光芒介绍
- 广东省珠海市2025-2026学年七年级上学期期中数学模拟试卷(含解析)
- 特训02 一元二次方程根与系数的关系通关专练-2025-2026学年九年级数学上学期期中期末挑战满分冲刺卷(人教版)(解析版)
- 第三章 概率的进一步认识(单元测试-基础卷)-北师大版九年级数学上册(附答案)
- 2023年福建高职单招语文真题试卷-(含参考答案)
- 船舶保安职责-保安意识考试题库(含答案)
- 特教概论知识点
- 红山窑中学残疾儿童送教上门教案
- 感染组:乙肝基因分型和乙肝耐药检测-课件
- 人教版新教材高中英语选择性必修一全册课文及翻译(中英word)
- 心脏结构和功能
- J-STD-020D[1].1中文版
- 饼干工艺流程图及说明参考范本
- 提高预制T梁预应力张拉一次合格率-QC小组总结
- (完整word版)监理优秀员工先进事迹材料
评论
0/150
提交评论