2014-10-29 15 views
7

Ho un codice come questo:In che modo getClass() è implementato in java?

public class QueueSample { 

    public static void main(String[] args) { 
     System.out.println(new QueueSample().getClass()); 
    } 

} 

esso stampa:

metodo
class QueueSample 

getClass() proviene dalla classe Object. Guardando il codice sorgente di Object, posso solo vedere definizione di metodo come questo:

public final native Class<?> getClass(); 

Se la sua non implementato qui, dove e in che modo questo metodo ha ottenuto implementato?

+2

'getClass()' è una chiamata al metodo nativo. Quindi, non avrai il codice sorgente di quel metodo nel codice sorgente fornito con JDK. – TheLostMind

+0

@TheLostMind: Quindi, in che modo il codice nativo lo implementa? – batman

+0

@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. –

risposta

5

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, ...)

+1

Questo è il "codice ordinario" che potrebbe essere invocato in modalità interpretata. È molto probabile che gli ottimizzatori di hotspot conoscano il metodo 'getClass()' e lo sostituiscano con qualcos'altro quando appare in un hotspot, usando il contesto circostante dell'invocazione per prevedere il risultato e guardando a ciò che stai effettivamente facendo con il risultato . Vedi https://wikis.oracle.com/display/HotSpotInternals/PerformanceTechniques#PerformanceTechniques-Intrinsics – Holger

Problemi correlati