Come cita @TheLostMind, è possibile ottenere il codice sorgente da OpenJDK - cerca in un qualche modo newer version (JDK9), il metodo nativo getClass()
è implementato come
JNIEXPORT jclass JNICALL
Java_java_lang_Object_getClass(JNIEnv *env, jobject this)
{
if (this == NULL) {
JNU_ThrowNullPointerException(env, NULL);
return 0;
} else {
return (*env)->GetObjectClass(env, this);
}
}
Quindi, in sostanza ciò che fa è che i delegati al JVM ambiente e utilizza la funzione GetObjectClass()
per restituire l'oggetto Class
. Puoi usare questo come punto di partenza - se vuoi approfondire, ti suggerisco di controllare il codice sorgente JDK da http://hg.openjdk.java.net/ usando mercurial, in modo da poterlo sfogliare.
Come cita @Holger, ci sono alcune ottimizzazioni delle prestazioni quando si utilizza un compilatore JIT, come hotspot - per esempio, Performance techniques used in the Hotspot JVM dice "Object.getClass()
è una o due istruzioni.". Ciò significa che il codice sopra mostra una possibile implementazione di Object.getClass()
, ma questa implementazione potrebbe cambiare durante il runtime e/o in base alla JVM effettiva (interpretata/JITted, client/server, standard Oracle/JRockit, ...)
fonte
2014-10-29 09:19:18
'getClass()' è una chiamata al metodo nativo. Quindi, non avrai il codice sorgente di quel metodo nel codice sorgente fornito con JDK. – TheLostMind
@TheLostMind: Quindi, in che modo il codice nativo lo implementa? – batman
@batman Perché vuoi sapere? Questo è qualcosa di molto complicato che dipende completamente dal modo in cui la Java Virtual Machine è implementata e da come funziona la struttura dei dati interni. Può differire per fornitore e versione di JVM. Finché getClass() funziona come descritto dalla specifica, non è necessario sapere come è implementato. –