una que objeto metodos metodo está esta ejemplos crear constituida como clases clase atributos atributo java classloader

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 hay parent ,
  • 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 . . . } }