欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOCX文档下载  

    在程序中实现对java源文件编译的3种方法.docx

    • 资源ID:3380749       资源大小:38.63KB        全文页数:10页
    • 资源格式: DOCX        下载积分:6.99金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要6.99金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    在程序中实现对java源文件编译的3种方法.docx

    在程序中实现对java源文件编译的3种方法一般情况下对java源文件的编译均是在代码完成后使用javac编译的,不管是使用 IDE还是直接使用命令行。这里要说的情况是比较特别的,就是在代码内动态的编译一些代码。比如你想通过在某个目录下通过放置一些源代码的方式来实现对程序功能的动态扩展,那么你的程序就需要具有一种对源代码的编译、加载、运行的能力,可能就需要本文介绍的3种方法。方法1:通过调用本机的javac命令来编译。在java程序中调用javac命令可以通过调用Runtime类的exec或是ProcessBuilder类的start方法来完成,这两个类的功能基本相同,用法也比较相似,这里的例子我们就用ProcessBuilder来演示。如果是JDK1.5之前的版本请使用Runtime类完成相同的功能。开始之前先来点准备工作,将下面的类放到 c:mytestsrc 目录下,这个类我们不会在IDE中编译,而是由我们程序完成其编译。保存时使用UTF-8格式。可以直接在附件中下载这个类。Java代码 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代码 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代码 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代码 imgMpile(new String"-encoding", "UTF-8","-d", binDir, filePath); Mpile(new String"-encoding", "UTF-8","-d", binDir, filePath);替换成:Java代码 img/ 将编译参数通过数组传递到编译方法中,该函数的方法和javac的参数完成一致 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler; compiler.run(null, null, null, "-encoding", "UTF-8","-d", binDir, filePath); / 将编译参数通过数组传递到编译方法中,该函数的方法和javac的参数完成一致JavaCompiler compiler = ToolProvider.getSystemJavaCompiler;compiler.run(null, null, null, "-encoding", "UTF-8","-d", binDir, filePath);就可以完成相应的编译功能,这里简介一下run的使用方法:注意:使用上传文件中的代码做测试时,为避免上次编译的影响记得手动删除C:mytestbin下的类文件

    注意事项

    本文(在程序中实现对java源文件编译的3种方法.docx)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开