Небезопасная проблема с загрузкой классов? - PullRequest
6 голосов
/ 10 мая 2011

У Unsafe есть метод для обеспечения инициализации классов:

Unsafe.ensureClassInitialized(Class) line: not available [native method]

Я подозреваю, что этот тип инициализации не блокирует класс, как обычная загрузка классов Java, потому что я иногда сталкивался снекоторые невозможные ситуации.Я могу дать более подробную информацию позже, если это необходимо, но кто-нибудь знает, если загрузка классов с помощью Unsafe имеет такие причуды?

Кстати, вот краткий след стека того, как этот класс загружается:

Unsafe.ensureClassInitialized(Class) line: not available [native method]               
UnsafeFieldAccessorFactory.newFieldAccessor(Field, boolean) line: 25
ReflectionFactory.newFieldAccessor(Field, boolean) line: 122    
Field.acquireFieldAccessor(boolean) line: 918    
Field.getFieldAccessor(Object) line: 899               
Field.get(Object) line: 358          

Ответы [ 2 ]

3 голосов
/ 09 октября 2013

Для справочных и веб-поисков оказывается, что вы можете принудительно инициализировать класс, не используя Unsafe:

Class.forName(cls.getName(), true, cls.getClassLoader());

Не красиво, но работает.

1 голос
/ 16 июня 2011

Здесь есть похожая проблема: https://issues.apache.org/bugzilla/show_bug.cgi?id=43867 (поиск «Небезопасно», чтобы перейти к соответствующему разделу), которая может оказаться полезной, хотя трудно сказать без дополнительного контекста и кода ...

Tomcat, стремясь очистить статические поля внутри класса с помощью отражения, невольно вызвал повторный запуск кода инициализации класса из-за того, как работает отражение.Когда он попадает в этот код, который пытается использовать фабрику журналов, он не знает, что он уже сломал логфакторию, установив для полей внутри логфактории значение NULL.напрямую или с помощью Tomcat) может быть проблемой ...

...