java.lang.ClassLoader
è una classe così grande. Utilizzando il tuo link GrepCode (, che è per la versione java 6-b14) puoi trovare alla riga 267 il metodo pubblico loadClass
.
Questo metodo, chiama un loadClass
metodo protetto alla linea 308 e questo metodo tenta di caricare una classe previosly caricata mediante:
findLoadedClass
che nelle estremità chiama i metodi nativi,
- Calling
parent.loadClass
,
findBootstrapClass0
(un metodo nativo anche) se non c'è parent
,
- E infine
findClass
se non viene trovata alcuna classe.
Questo è importante per dire, perché ClassLoader
tenta di riutilizzare le clases già caricate, tenere presente.
Ma, dove viene richiamato defineClass
? Nessun posto da questa classe astratta, ma se si utilizza lo strumento di riferimento di GrepCode e si cerca dove viene utilizzato defineClass
(see here results), troverete molte classi concrete che alla fine chiamano definClass
.
Non è semplice, alcune di queste classi, override defineClass
mentre altri chiama la propria loadClass
che poi chiama ... e così via, ma alla fine si chiama defineClass
.
Non dimenticate che defineClass
di ClassLoader
finisce in uno dei tre metodi nativi che sono responsabili di JVM magia: defineClass0
, defineClass1
e/o defineClass2
Modifica
funzione nativa defineClass0
chiamate Java_java_lang_ClassLoader_defineClass0
da ClassLoader.c
e lo stesso per 1 e 2 funzioni.
Questa funzione crea la classe richiesta utilizzando JVM_DefineClassWithSource
definita in jvm.h
e implementata in openjdk\hotspot\src\share\vm\prims\jvm.cpp
.
Questo ultimo file definisce la funzione jvm_define_class_common
che alla fine è la funzione che crea la classe richiesta. Infine, questa funzione chiama JNIHandles::make_local
per allocare la classe. Puoi vedere il codice di questa ultima funzione in openjdk\hotspot\src\share\vm\runtime\jniHandles.cpp
Spero che risponda alla tua domanda.
Quando si ha a che fare con interni JVM (magia!), Un buon sospetto è che le cose stiano accadendo nel codice nativo (C/C++/asm). – Nayuki
Certo che potrebbe essere, ma la domanda è: quando accade (appare l'oggetto Class)? Il linguaggio di implementazione non è importante –