Класс.getConstantPool()

Если вы декомпилируете класс java.lang.Class в java из библиотеки rt.jar, вы заметите, что есть собственное объявление метода:

native ConstantPool getConstantPool();

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


person Alexandru Luchian    schedule 22.12.2008    source источник


Ответы (1)


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

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

person Tom Hawtin - tackline    schedule 22.12.2008
comment
Вы правы, исходники есть, декомпилировать не надо. Это может быть глупый вопрос, но как сделать ваш код/приложение надежным, или это может сделать только Sun? - person Alexandru Luchian; 23.12.2008
comment
Ненадежный/надежный применяется только в том случае, если у вас есть диспетчер безопасности (например, с помощью WebStart или подключаемого модуля). Чтобы доверять этим средам, можно подписать файлы jar или изменить файл политики. Доступ к пакету контролируется свойством package.access security. - person Tom Hawtin - tackline; 23.12.2008