Когда вызывается метод checkPackageAccess ClassLoader
Я хотел бы понять, когда JVM вызывает метод checkPackageAccess ClassLoader. Из javadoc я прочитал, что он вызывается JVM после загрузки класса с загрузчиком классов. Но я обнаружил, что иногда он вызывается более одного раза после loadclass. На каком основании JVM решает это назвать. Буду очень признателен, если кто-то сможет уточнить метод.
Чтобы было легче понять, вот что я сделал:
- Я запускаю одну и ту же программу дважды. Оба раза с -noverify
- В одном прогоне я удаляю
<clinit>
из классов, в другой не беги.
Бег с <clinit>
выглядит так: беги с клинитом
Один без так: беги без клинита
Так что, как вы видите, прогон без клиник приводит к трем checkPackageAccess
после java.sql.DriverPropertyInfo
был загружен в то время как нормальный запуск (с Clinit) приводит только к одному. Поскольку в обоих случаях <clinit>
(ни оригинальный, ни пустой во втором прогоне) еще не реализован. Интересно, что заставляет JVM выполнить это? checkPackageAccess
вызов.
- Первый
checkPackageAccess
дляjava.sql.DriverPropertyInfo
(в
оба бега) - Второй для
java.util.concurrent.ConcurrentHashMap
- Третий для
java.lang.ref.ReferenceQueue
Я использую JVMTI methodEntry и methodExit события, чтобы генерировать след всего, что происходит. Тем не менее я не могу объяснить, что приводит к этим дополнительным checkPackageAccess
звонки.