Class.getConstantPool () - PullRequest
       10

Class.getConstantPool ()

1 голос
/ 23 декабря 2008

Если вы декомпилируете класс 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 не хочет, чтобы я вызывал его напрямую.

1 Ответ

1 голос
/ 23 декабря 2008

Классы под солнцем. * Не являются общедоступными API, могут изменяться без уведомления и выполнять любые действия. К сожалению, ненадежный код вообще не может получить к ним доступ. javac объекты для их использования.

Нет необходимости декомпилировать код - доступен исходный источник , хотя не обязательно в актуальном состоянии.

...