Если вы декомпилируете класс java.lang.Class в java из библиотеки rt.jar, вы заметите, что существует объявление нативного метода:
native ConstantPool getConstantPool();
Некоторое время назад я играл с декомпиляцией классов, используя спецификацию файла Sun.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 не хочет, чтобы я вызывал его напрямую.