现在的位置: 首页 > 综合 > 正文

java compiler 到底做了什么事情

2018年04月20日 ⁄ 综合 ⁄ 共 3422字 ⁄ 字号 评论关闭
-------
android培训
java培训、期待与您交流! ----------

下面是我在 windows 命令行编译一个 .java 程序,使能 verbose 选项时打印的东西:

D:\j2se 练习\others>javac -verbose RandomTest.java

[语法分析开始时间 RegularFileObject[RandomTest.java]]
[语法分析已完成, 用时 15 毫秒]
[源文件的搜索路径: .]
[类文件的搜索路径: D:\Program Files (x86)\Java\jdk1.7.0_15\jre\lib\resources.jar
,D:\Program Files (x86)\Java\jdk1.7.0_15\jre\lib\rt.jar,D:\Program Files (x86)\J
ava\jdk1.7.0_15\jre\lib\sunrsasign.jar,D:\Program Files (x86)\Java\jdk1.7.0_15\j
re\lib\jsse.jar,D:\Program Files (x86)\Java\jdk1.7.0_15\jre\lib\jce.jar,D:\Progr
am Files (x86)\Java\jdk1.7.0_15\jre\lib\charsets.jar,D:\Program Files (x86)\Java
\jdk1.7.0_15\jre\lib\jfr.jar,D:\Program Files (x86)\Java\jdk1.7.0_15\jre\classes
,D:\Program Files (x86)\Java\jdk1.7.0_15\jre\lib\ext\access-bridge-32.jar,D:\Pro
gram Files (x86)\Java\jdk1.7.0_15\jre\lib\ext\dnsns.jar,D:\Program Files (x86)\J
ava\jdk1.7.0_15\jre\lib\ext\jaccess.jar,D:\Program Files (x86)\Java\jdk1.7.0_15\
jre\lib\ext\localedata.jar,D:\Program Files (x86)\Java\jdk1.7.0_15\jre\lib\ext\s
unec.jar,D:\Program Files (x86)\Java\jdk1.7.0_15\jre\lib\ext\sunjce_provider.jar
,D:\Program Files (x86)\Java\jdk1.7.0_15\jre\lib\ext\sunmscapi.jar,D:\Program Fi
les (x86)\Java\jdk1.7.0_15\jre\lib\ext\sunpkcs11.jar,D:\Program Files (x86)\Java
\jdk1.7.0_15\jre\lib\ext\zipfs.jar,.]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/lang/Object.class)]]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/lang/String.class)]]
[正在检查RandomTest]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/lang/AutoCloseable.class)]]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/lang/System.class)]]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/io/PrintStream.class)]]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/io/FilterOutputStream.class)]]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/io/OutputStream.class)]]
[已写入RegularFileObject[RandomTest$1.class]]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/lang/StringBuilder.class)]]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/lang/CharSequence.class)]]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/io/Serializable.class)]]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/lang/Comparable.class)]]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/lang/AbstractStringBuilder.class)]]
[正在加载ZipFileIndexFileObject[D:\Program Files (x86)\Java\jdk1.7.0_15\lib\ct.s
ym(META-INF/sym/rt.jar/java/lang/StringBuffer.class)]]
[已写入RegularFileObject[RandomTest.class]]

[共 530 毫秒]

从这个结果可以看出, java compiler 至少做了 1.分析 java 源文件 2.搜索源文件路径 3.搜索类文件路径 4.加载依赖的类 5.把结果写入 .class 文件

其中 javac 主要的作用就是把 java 源文件编译为 class 文件,class 文件中主要有三部分,一是 class 常量池,二是 java 类的各种属性结构,三是 method info 结构中的code[] 中保存的字节码指令序列,这三部分中,指令序列主要对应了 java 源文件中的方法中的语句;各种属性结构,主要对应了类中各种标识符的签名标签、属性修饰等,比如 字段、方法、接口、类 的各种修饰符,还有 method 签名的结构,比如 返回值、参数列表中的参数类型;常量池主要就是保存类的定义中涉及到的常量数据,比如
int long float double utf-8,其中所有涉及到的标识符、字符串最终就保存为 utf-8 形式。jvm 在执行这个 class 文件中的函数的时候,很重要的工作就是解析这些符号引用。

如有转载请标明原文链接


抱歉!评论已关闭.