1

如果你从 rt.jar 库中反编译java.lang.Class类,你会注意到有一个本地方法声明:

native ConstantPool getConstantPool();

不久前,我使用 Sun 的 .class 文件规范进行了类反编译,并且能够从每个 .class 文件中获取常量池记录。但这实际上是反编译类。

只是在 Class 类中看到这个签名很惊讶。所以我所做的是我在 Main() 方法中编写了一小段代码:

ConstantPool cp = new ConstantPool();
cp.getMethodAtIfLoaded(0);

如果你反编译sun.reflect.ConstantPool类,你会注意到它有很多与类、方法、参数、声明的字段等相关的方法。

当我执行应用程序时,我得到了这个 HotSpot 异常:

#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d7e01d3, pid=2816, tid=5464
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0_15-b04 mixed mode)
# Problematic frame:
# V  [jvm.dll+0xa01d3]
#
# An error report file with more information is saved as hs_err_pid2816.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#

为什么我不能得到任何类的ConstantPool ?考虑到getConstantPool()是本机/非公共方法这一事实,我认为 Sun 不希望我直接调用它。

4

1 回答 1

1

sun.* 下的类不是公共 API,可能会在没有通知的情况下更改并执行各种操作。幸运的是,不受信任的代码根本无法访问它们。javac 对象供其使用。

无需反编译代码 -原始源代码可用,但不一定是最新的。

于 2008-12-22T23:28:36.543 回答