2011-05-10 12 views
5

protección causa un método para asegurar que las clases se inicializan:¿Problema de carga de clases inseguras?

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

sospecho que este tipo de inicialización no se bloquea en la clase como regular de clase java-carga de vez en cuando porque he encontré con algunas situaciones imposibles . Puedo dar más detalles más adelante si es necesario, pero ¿alguien sabe si la carga de clases con Unsafe tiene peculiaridades como esa?

Por cierto, aquí está un breve seguimiento de la pila de la forma en que la clase se carga hasta:

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   
+0

¿qué versión de java y vendedor de jvm? ¿Alguna inyección de código byte o reescritura? cargadores de clases personalizados? – Ron

+0

¿Qué tipo de situaciones imposibles estás viendo? ¿Estás recibiendo excepciones? –

+0

¿creas el campo en el inicializador estático? – bestsss

Respuesta

1

Hay un problema similar aquí: https://issues.apache.org/bugzilla/show_bug.cgi?id=43867 (búsqueda de "inseguro" para saltar a la sección correspondiente), que podría ser de asistencia, aunque es difícil decir sin más contexto y el código ...

Tomcat, en el deseo de limpiar las campos estáticos dentro de una clase mediante reflexión, ha causado involuntariamente la ini clase código t para volver a ejecutar debido a la forma en que funciona la reflexión . Cuando muestra este código que intenta utilizar la fábrica de registros , no sabe que ya ha roto la logfactory por configurando los campos dentro de la logfactory para anular.

Así limpieza de campos de reflexión (directamente o mediante el uso de Tomcat) podría ser un problema ...

+0

en realidad, toda la idea de borrar los campos de las clases cargadas por un determinado cargador de clases para liberar el cargador de clases es extraño. Hay 2 formas de filtrar cosas, ejecutar hilos (+ referencias JNI) y referencias fuera de la aplicación web. Las referencias dentro de la aplicación web no perderán nada por sí mismas ya que son salientes, no entrantes. Entonces establecer los campos en cero no ayuda mucho. – bestsss

1

para referencia y web seaches, resulta que puede forzar la inicialización de clase sin utilizar Unsafe:

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

No es bonito, pero funciona.

Cuestiones relacionadas