2

我只是想知道 java.lang.Object、java.lang.String 等类(在 Oracle 提供的 rt.jar 内)是如何从 .java 源文件生成的。我认为,他们的javac不可能编译它们。

我试图编译包含“class Dummy{}”的 Dummy.java

lab@labb:~/Documents$ 设置 PATH=.:$JAVA_HOME/bin

lab@labb:~/Documents$ 设置 CLASSPATH=。

lab@labb:~/Documents$ javac -verbose Dummy.java

[解析开始RegularFileObject[Dummy.java]]

【解析完成12ms】

[源文件的搜索路径:.]

【类文件的搜索路径:/usr/lib/jvm/java-7-oracle/jre/lib/resources.jar,/usr/lib/jvm/java-7-oracle/jre/lib/rt.jar,/ usr/lib/jvm/java-7-oracle/jre/lib/sunrsasign.jar,/usr/lib/jvm/java-7-oracle/jre/lib/jsse.jar,/usr/lib/jvm/java- 7-oracle/jre/lib/jce.jar,/usr/lib/jvm/java-7-oracle/jre/lib/charsets.jar,/usr/lib/jvm/java-7-oracle/jre/classes, /usr/lib/jvm/java-7-oracle/jre/lib/ext/sunpkcs11.jar,/usr/lib/jvm/java-7-oracle/jre/lib/ext/dnsns.jar,/usr/lib /jvm/java-7-oracle/jre/lib/ext/zipfs.jar,/usr/lib/jvm/java-7-oracle/jre/lib/ext/localedata.jar,/usr/lib/jvm/java -7-oracle/jre/lib/ext/sunec.jar,/usr/lib/jvm/java-7-oracle/jre/lib/ext/sunjce_provider.jar,.]

[加载 ZipFileIndexFileObject[/usr/lib/jvm/java-7-oracle/lib/ct.sym(META-INF/sym/rt.jar/java/lang/ Object .class)]]

[检查假人]

[加载 ZipFileIndexFileObject[/usr/lib/jvm/java-7-oracle/lib/ct.sym(META-INF/sym/rt.jar/java/lang/ AutoCloseable .class)]]

[写了 RegularFileObject[Dummy.class]] [总共 131 毫秒]

4

2 回答 2

2

所有类都可以表示为 Java 代码(您可以在这里看到:http: //www.docjar.com/docs/api/java/lang/package-index.html)并由 javac 编译。Object是一种特殊情况,当被 VM 加载时,它不会获得超类。

于 2012-09-27T13:44:34.107 回答
0

您可以使用反编译器(例如JAD)来查看 .class 的源文件的外观。

在基类的情况下,需要一些方法,native并且它们的实现在依赖于系统的库(如dllWindows 或soLinux)中提供。

String 只有一种方法 native(实习生)。对象有更多。JRE 中有一些类需要本地来完成与 SO 相关的事情,并且非常低级,例如原子值或线程(感谢 @yshavit),但绝大多数 JRE 库代码都是用 Java 编程的。

于 2012-09-27T13:54:55.100 回答