objeto - que es un metodo en java
¿Quién crea primeramente el objeto Clase<?> Durante el proceso de carga de clases? (3)
En la documentation encontré:
Los objetos de clase son construidos automáticamente por la Máquina Virtual de Java a medida que se cargan las clases y por las llamadas al método defineClass en el cargador de clases.
Verifiqué el código fuente , pero no encontré el lugar que se debe llamar a defineClass
p. ¿Podría mostrarme, por favor, quién y cuándo llamar defineClass
método defineClass
según este esquema:
source imagen
El método defineClass()
se llama durante la invocación de ClassLoader#loadClass()
. Sin embargo, esto no se hace directamente dentro de la clase java.lang.ClassLoader
sino en una de sus subclases, por ejemplo, en URLClassLoader#findClass()
.
La llamada a ClassLoader#defineClass()
termina en una llamada a uno de los métodos nativos defineClass1()
o defineClass2()
. Las implementaciones en C de estos métodos se pueden encontrar en OpenJDK en src/share/native/java/lang/ClassLoader.c
.
java.lang.ClassLoader
es una clase tan grande. Usando su enlace GrepCode ( que es para la versión 6-b14 de java ) puede encontrar en la línea 267 el método público de loadClass
.
Este método llama a un método loadClass
protegido en la línea 308 y este método intenta cargar una clase cargada previamente utilizando:
-
findLoadedClass
que en los extremos llama métodos nativos, - Llamando a
parent.loadClass
, -
findBootstrapClass0
( un método nativo también ) si no hayparent
, - Y finalmente
findClass
clase si no se encuentra ninguna clase.
Es importante decir esto, porque ClassLoader
intenta reutilizar las clases ya cargadas, tenga en cuenta.
Pero, ¿dónde se invoca defineClass
? No hay lugar de esta clase abstracta, pero si usa la herramienta de referencia de GrepCode y busca dónde se usa defineClass
( vea aquí los resultados ) encontrará muchas clases concretas que al final llaman definClass
.
No es sencillo, algunas de estas clases reemplazan a defineClass
mientras que otras llaman a su propia loadClass
que luego llama ... y así sucesivamente, pero finalmente llama a defineClass
.
No olvide que defineClass
of ClassLoader
termina en uno de los tres métodos nativos que son responsables de la magia JVM : defineClass0
, defineClass1
y / o defineClass2
Editar
La función nativa defineClass0
llama a Java_java_lang_ClassLoader_defineClass0
desde ClassLoader.c
y lo mismo para las funciones 1 y 2.
Esta función crea la clase requerida utilizando JVM_DefineClassWithSource
definida en jvm.h
e implementada en openjdk/hotspot/src/share/vm/prims/jvm.cpp
.
Este último archivo define la función jvm_define_class_common
, que al final es la función que crea la clase requerida. Finalmente, esta función llama a JNIHandles::make_local
para asignar la clase. Puede ver el código de esta última función en openjdk/hotspot/src/share/vm/runtime/jniHandles.cpp
Espero que responda a tu pregunta.
class NetworkClassLoader extends ClassLoader {
String host;
int port;
public Class findClass(String name) {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) {
// load the class data from the connection
. . .
}
}