http://www.newiter.com/showart.asp?id=33

由于比较长,建议点击上面链接进入继续浏览

对于很多应用系统,常常需要动态装载和执行类和代码片断,这有利于部署的简易性和系统设计上的灵活性。本文给出了一个比较全面的介绍,值得参考。

在Sun JDK 1.2及后续版本中,包含了一组可在程序运行时刻编译和执行Java代码的API。这些API被包含在tools.jar类库中。这个功能允许Java程序在运行时动态编译、执行小的代码块,在有些情况下这个功能会让Java应用程序的架构更加灵活、开放。

本文假定读者已经在计算机中安装并配置好了Sun JDK 1.2或更高的版本,并对javac编译器命令有所了解。

在Java程序中使用编译器

假定要使用javac命令编译 /home/mytest目录下Test.java文件,并设定class文件存放在/home/mytest/classes路径下,输入下面命令:

javac -d /home/mytest/classes Test.java

达到同样的目的,也可以使用Sun提供的一个Java编译器的API来实现。它的使用也很简单,核心代码段如下:

String[] args = new String[] {“-d”, “/homemytestclasses”, “Test.java”};

Int status = javac.compile(args);

javac编译工具被安装在JDK根目录的/bin目录下,负责将源代码编译成运行于JVM的字节码。事实上,我们经常使用/bin目录下的javac编译工具来编译Java源文件。如果在Java程序中动态编译任意制定的Java语句,使用这个外部的javac编译器就显得不够灵活了。虽然有时可使用Runtime类来执行一个外部命令,但如果想知道代码是否被编译通过、编译时发生了什么错误,用Runtime类的exec()方法就很难实现了。

在Sun的JDK 1.2及后续版本中,JDK安装路径的/lib路径下包含了一个tools.jar文件,这个类库包含了一个完整的编译器包。com.sun.tools.javac.Main是编译器的主类入口,如果已经熟悉了javac编译器命令行的使用方法,很容易理解这个类的使用方法。方法compile(String[] p)执行编译动作,参数p是一个String数组,用来存放javac命令的参数选项,编译后的状态返回一个Int值,其对应值参考如下表所示:

表 状态参数与对应值

EXIT_OK 0

EXIT_ERROR 1

EXIT_CMDERR 2

EXIT_SYSERR 3

EXIT_ABNORMAL 4

在程序执行时编译和执行Java语句

从上面一段中,我们已经基本了解了动态编译一个Java文件的方法。那么,如何运行时动态编译指定的Java语句呢?这里需要一个技巧。

假设要动态编译的Java条语句如下:

System.out.println(“Hello,This runtime code!”);

编译器不支持编译单个Java语句,被编译的对象必须是一个以.java为后缀的、结构合法的类源程序文件,所以需要对这个语句进行改造,变成一个完整的类,并把这条语句置入main方法中,便于测试。

public class {

public static void main(String[] args) throws Exception {

System.out.println(“Hello,This runtime code!”);

}

}

这样,欲动态编译的代码已经被程序动态拼装成了上面那段代码,准备工作还没有结束,不过看起来工作在趋向稍微的复杂化。因为上述代码当前还存放在内存中,编译器似乎对一个硬盘文件更感兴趣。我们需要引用java.io.File类(JDK 1.2以上),创建一个临时的文件来存放上述代码的内容。java.io.File类的静态方法createTempFile()方法保证所创建的文件名是不重复的,这样会增大这段程序的灵活性。灵活性取决于真正应用到系统架构中的策略。

System.getProperty(“user.dir”)用来获得当前路径,在这里作为临时文件的存放目录。

File file;

file = File.createTempFile(“JavaRuntime”, “.java”, new File(System.getProperty(“user.dir”)));

String filename = file.getName();

String classname = getClassName(filename);

//将代码输出到文件

PrintWriter out = new PrintWriter(new FileOutputStream(file));

out.println(“public class” + classname + “ {”};

out.println(“..代码..”);

out.println(“}”);

//关闭文件流

out.flush();

out.close();

我们约定被创建的临时文件名以“JavaRuntime”为头缀(可任意命名),后缀名以“.java”结尾。一个待编译的Java源文件已被动态生成。下一步要从com.sun.tools.javac包中创建一个Main实例,调用javac.compile()方法编译这个临时文件:

◆◆

评论读取中....

请登录后再发表评论!

◆◆

修改失败,请稍后尝试

jcreator把class字节码文件转成.java源文件_如何将.JAVA文件编译成.CLASS文件.说明方法和工具,或用JCreator如何操作?...相关推荐

  1. JVM 字节码文件与类加载

    文章目录 前端编译器与后端编译器 解释执行和 JIT&AOT "类"的生命周期 字节码文件的读取解析 "类"的生命周期 加载阶段 链接阶段 初始化阶段 ...

  2. 【Groovy】闭包 Closure ( 闭包定义 | 闭包类型 | 查看编译后的字节码文件中的闭包类型变量 )

    文章目录 一.闭包定义 二.闭包类型 三.查看编译后的字节码文件中的闭包类型变量 一.闭包定义 闭包 Closure 是 Groovy 中最常用的特性 , 使用闭包作为参数是 Groovy 语言的明显 ...

  3. php编译成二进制文件_JVM字节码文件概述

    字节码文件概述 字节码文件的跨平台性 Java语言:跨平台的语言 当Java源代码成功编译字节码后,如果想在不同的平台上面运行,则无需再次编译 这个优势目前来说已经不再吸引人,因为Python.PHP ...

  4. 【开发环境】Android 命令行中执行 Java 程序 ( IntelliJ IDEA 中创建 Java / Kotlin 工程 | dx 打包 DEX 字节码文件 | dalvikvm 命令 )

    文章目录 前言 一.IntelliJ IDEA 中创建 Java / Kotlin 工程 二.准备 Java 和 Kotlin 代码 三.编译在 PC 上可执行的 Java / Kotlin JAR ...

  5. 【Java 虚拟机原理】Class 字节码二进制文件分析 一 ( 字节码文件附加信息 | 魔数 | 次版本号 | 主版本号 | 常量池个数 )

    文章目录 一.字节码文件 与 JVM 二.字节码文件示例 三.字节码文件二进制结构分析 1.魔数 2.次版本号 3.主版本号 4.常量池个数 一.字节码文件 与 JVM Java 源码编译成 Clas ...

  6. 【Android 热修复】热修复原理 ( 热修复框架简介 | 将 Java 字节码文件打包到 Dex 文件 )

    文章目录 一. 热修复框架简介 1.类替换 2.so 替换 3.资源替换 4.全平台支持 5.生效时间 6.性能损耗 7.总结 二. 将 Java 字节码文件打包到 Dex 文件 一. 热修复框架简介 ...

  7. class字节码文件中的常量池结构详解

    文章目录 前言 方法区 常量池基本结构 JVM 所定义的11种常量 常量池元素的复合结构 常量池的结束位置 常量池元素总数量 第一个常量池元素 父类常量 变量型常量池元素 自己的学习笔记,部分节选自& ...

  8. 字节码文件的内部结构之谜

    如果计算机的 CPU 只有「x86」这一种,或者操作系统只有 Windows 这一类,那么或许 Java 就不会诞生.Java 诞生之初就曾宣扬过它的初衷,「一次编写,多处运行」,而它之所以能够实现跨 ...

  9. java字节码文件学习

    字节码文件结构篇 java虚拟机规范--字节码文件官网:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.1 ...

最新文章

  1. java if-then和if-then-else语句(翻译自Java Tutorials)
  2. 网络协议之:一定要大写的SOCKS
  3. java 16进制整数,Java将整数转换为十六进制整数
  4. 双目立体视觉匹配算法-----SAD匹配算法、BM算法、SGBM算法、GC算法
  5. 疑似小米7工程机在咸鱼开售,售价100万起?
  6. 虚拟服务器英文版设置,apache配置(linux及windows中的设置)以及虚拟主机的设置(国外英语资料).doc...
  7. Java枚举类型的用法
  8. 每日算法系列【LeetCode 685】冗余连接 II
  9. 【IT历史】SP和CP
  10. 论计算机在化工过程控制中的应用,计算机在化工中的应用论文正稿.doc
  11. 回归分析结果表格怎么填_excel回归分析结果解读
  12. Verilog笔记(四)状态机
  13. 经过spring cloud gateway 网关访问nacos上的服务
  14. 谷歌开源图片压缩算法Guetzli实测体验报告
  15. 给学计算机的男友买什么礼物,毕业季,男朋友初入职场送礼好物推荐!
  16. 地球人口承载力估计【小学奥数7653】
  17. 网络诊断提示DNS服务器未响应处理
  18. 网络安全红队详细接收
  19. 如何转换字体为手写体?艺术字体在线生成器怎么用?
  20. 有关WEB前端中的语义化

热门文章

  1. 成为一名斜杠程序员,你还差点什么?
  2. 程序员,活得是本事:30 岁后的 20 条人生建议
  3. 小公司出身的我,是如何拿下知名独角兽公司 Offer?
  4. 被“遗弃”的互联网老年人 | 畅言
  5. 开源天生就不是为了赚钱!
  6. 高达 800 万次下载量的 npm 包被黑客篡改了代码,你的设备或正成为挖矿机
  7. 微软“黑历史”:一个活了 45 年的愚蠢 Bug!
  8. “滚蛋吧”扎克伯格!
  9. 程序员相亲,因一双运动鞋惨被拒绝
  10. AI 专业人才缺口上百万,年薪 80 万远超同行