如果你从 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 不希望我直接调用它。