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:
-
findLoadedClassque en los extremos llama métodos nativos, - Llamando a
parent.loadClass, -
findBootstrapClass0( un método nativo también ) si no hayparent, - Y finalmente
findClassclase 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
. . .
}
}