《2022年在程序中实现对java源文件编译的种方 .pdf》由会员分享,可在线阅读,更多相关《2022年在程序中实现对java源文件编译的种方 .pdf(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、在程序中实现对java 源文件编译的3 种方法一般情况下对java源文件的编译均是在代码完成后使用javac编译的,不管是使用 IDE 还是直接使用命令行。这里要说的情况是比较特别的,就是在代码内动态的编译一些代码。比如你想通过在某个目录下通过放置一些源代码的方式来实现对程序功能的动态扩展,那么你的程序就需要具有一种对源代码的编译、加载、运行的能力,可能就需要本文介绍的3 种方法。方法 1:通过调用本机的javac 命令来编译。在 java程序中调用javac 命令可以通过调用Runtime 类的 exec 或是 ProcessBuilder类的start方法来完成,这两个类的功能基本相同,用
2、法也比较相似,这里的例子我们就用ProcessBuilder来演示。如果是JDK1.5 之前的版本请使用Runtime 类完成相同的功能。开始之前先来点准备工作,将下面的类放到 c:mytestsrc 目录下,这个类我们不会在IDE中编译,而是由我们程序完成其编译。保存时使用UTF-8 格式。可以直接在附件中下载这个类。Java代码imghttp:/ public class HelloWorld public void sayHello(String in)System.out.println(动态编译成功);System.out.println(使用编译方式:+in);public cla
3、ss HelloWorld public void sayHello(String in)System.out.println(动态编译成功);System.out.println(使用编译方式:+in);准备工作完成,下面就看一下我们程序的代码,这里只列出主要代码Java代码imghttp:/ public class JavacCompile 名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 6 页 -private static String filePath=c:mytestsrcHelloWorld.java;private static String binDir=c:
4、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(
5、);/处理进程的输出,避免挂死 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(L
6、evel.SEVERE,null,ex);private static void processStream(InputStream stderr).名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 6 页 -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(binD
7、ir);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(pr
8、oc.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)
9、.名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 6 页 -LoaderClassByDir类的代码会保含在后面的上传的文件中,因为这里主要介绍完成程序中对java源文件的编译,对于类的加载和运行不多做描述,可以参考LoaderClassByDir类中的简单实现。方法 2:使用 Sun的 tools.jar包时的 com.sun.tools.javac.Main类完成对代码的编译。注意这个类的是在tools.jar包里,tools.jar不是标准的Java 库,在使用时必须要设置这个 jar的路径,使用IDE 时需要显示的引入到编译路径中,不然会找不到。我们使用此类改写上面的编译
10、类如下:Java代码imghttp:/ 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(
11、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;priv
12、ate static String binDir=c:mytestbin;名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 6 页 -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
13、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中了
14、。使用这个类的方法和上面的类很相似,我只需要将Java代码imghttp:/ Mpile(new String-encoding,UTF-8,-d,binDir,filePath);Mpile(new String-encoding,UTF-8,-d,binDir,filePath);替换成:Java代码imghttp:/ 的参数完成一致 JavaCompiler compiler=ToolProvider.getSystemJavaCompiler();compiler.run(null,null,null,-encoding,UTF-8,-d,binDir,filePath);名师资料总结
15、-精品资料欢迎下载-名师精心整理-第 5 页,共 6 页 -/将编译参数通过数组传递到编译方法中,该函数的方法和javac 的参数完成一致 JavaCompiler compiler=ToolProvider.getSystemJavaCompiler();compiler.run(null,null,null,-encoding,UTF-8,-d,binDir,filePath);就可以完成相应的编译功能,这里简介一下run 的使用方法:注意:使用上传文件中的代码做测试时,为避免上次编译的影响记得手动删除C:mytestbin下的类文件名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 6 页 -