jcreator把class字节码文件转成.java源文件_如何将.JAVA文件编译成.CLASS文件.说明方法和工具,或用JCreator如何操作?...
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如何操作?...相关推荐
- JVM 字节码文件与类加载
文章目录 前端编译器与后端编译器 解释执行和 JIT&AOT "类"的生命周期 字节码文件的读取解析 "类"的生命周期 加载阶段 链接阶段 初始化阶段 ...
- 【Groovy】闭包 Closure ( 闭包定义 | 闭包类型 | 查看编译后的字节码文件中的闭包类型变量 )
文章目录 一.闭包定义 二.闭包类型 三.查看编译后的字节码文件中的闭包类型变量 一.闭包定义 闭包 Closure 是 Groovy 中最常用的特性 , 使用闭包作为参数是 Groovy 语言的明显 ...
- php编译成二进制文件_JVM字节码文件概述
字节码文件概述 字节码文件的跨平台性 Java语言:跨平台的语言 当Java源代码成功编译字节码后,如果想在不同的平台上面运行,则无需再次编译 这个优势目前来说已经不再吸引人,因为Python.PHP ...
- 【开发环境】Android 命令行中执行 Java 程序 ( IntelliJ IDEA 中创建 Java / Kotlin 工程 | dx 打包 DEX 字节码文件 | dalvikvm 命令 )
文章目录 前言 一.IntelliJ IDEA 中创建 Java / Kotlin 工程 二.准备 Java 和 Kotlin 代码 三.编译在 PC 上可执行的 Java / Kotlin JAR ...
- 【Java 虚拟机原理】Class 字节码二进制文件分析 一 ( 字节码文件附加信息 | 魔数 | 次版本号 | 主版本号 | 常量池个数 )
文章目录 一.字节码文件 与 JVM 二.字节码文件示例 三.字节码文件二进制结构分析 1.魔数 2.次版本号 3.主版本号 4.常量池个数 一.字节码文件 与 JVM Java 源码编译成 Clas ...
- 【Android 热修复】热修复原理 ( 热修复框架简介 | 将 Java 字节码文件打包到 Dex 文件 )
文章目录 一. 热修复框架简介 1.类替换 2.so 替换 3.资源替换 4.全平台支持 5.生效时间 6.性能损耗 7.总结 二. 将 Java 字节码文件打包到 Dex 文件 一. 热修复框架简介 ...
- class字节码文件中的常量池结构详解
文章目录 前言 方法区 常量池基本结构 JVM 所定义的11种常量 常量池元素的复合结构 常量池的结束位置 常量池元素总数量 第一个常量池元素 父类常量 变量型常量池元素 自己的学习笔记,部分节选自& ...
- 字节码文件的内部结构之谜
如果计算机的 CPU 只有「x86」这一种,或者操作系统只有 Windows 这一类,那么或许 Java 就不会诞生.Java 诞生之初就曾宣扬过它的初衷,「一次编写,多处运行」,而它之所以能够实现跨 ...
- java字节码文件学习
字节码文件结构篇 java虚拟机规范--字节码文件官网:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.1 ...
最新文章
- java if-then和if-then-else语句(翻译自Java Tutorials)
- 网络协议之:一定要大写的SOCKS
- java 16进制整数,Java将整数转换为十六进制整数
- 双目立体视觉匹配算法-----SAD匹配算法、BM算法、SGBM算法、GC算法
- 疑似小米7工程机在咸鱼开售,售价100万起?
- 虚拟服务器英文版设置,apache配置(linux及windows中的设置)以及虚拟主机的设置(国外英语资料).doc...
- Java枚举类型的用法
- 每日算法系列【LeetCode 685】冗余连接 II
- 【IT历史】SP和CP
- 论计算机在化工过程控制中的应用,计算机在化工中的应用论文正稿.doc
- 回归分析结果表格怎么填_excel回归分析结果解读
- Verilog笔记(四)状态机
- 经过spring cloud gateway 网关访问nacos上的服务
- 谷歌开源图片压缩算法Guetzli实测体验报告
- 给学计算机的男友买什么礼物,毕业季,男朋友初入职场送礼好物推荐!
- 地球人口承载力估计【小学奥数7653】
- 网络诊断提示DNS服务器未响应处理
- 网络安全红队详细接收
- 如何转换字体为手写体?艺术字体在线生成器怎么用?
- 有关WEB前端中的语义化