2012-05-14 13 views
31

Ho controllato il codice sorgente di Object classe dove ho scoperto che dichiarazione del metodo di getClass() eraPerché i metodi nativi hashCode() e getClass()?

public final native Class<?> getClass(); 

E la dichiarazione di hashCode() era

public native int hashCode(); 

Perché questi due metodi native metodi nella classe e come posso ottenere il codice sorgente di questi metodi?

+13

non è un duplicato - l'OP sa che cosa è nativo, ma vuole sapere _ perché sono specificatamente questi due metodi. – Alnitak

+5

hashCode() è nativo perché il modo in cui i dati vengono archiviati può differire in sistemi operativi diversi. Non sono sicuro del perché getClass() sia; probabilmente a causa di diverse implementazioni del polimorfismo. – Vulcan

+1

@Vulcan getClass() è definitivo quindi non è possibile sovrascriverlo e interrompere il sistema di tipi. – EJP

risposta

35

È possibile trovare il codice sorgente completo dei metodi nativi here

Spero che questo lavoro per voi.

Questi sono metodi nativi, perché devono interagire con la macchina. Qui il codice dipendente dalla macchina è scritto nel linguaggio C, che non viene fornito con il pacchetto sorgente o nello rt.jar della posizione lib dello Java Runtime Environment (JRE).

Un motivo in più per essere nativi è probabilmente per motivi di prestazioni. A causa della programmazione a livello C, le prestazioni possono essere migliorate, quindi potrebbero aver scritto il codice nativo nel linguaggio C.

I metodi sono nativi perché riguardano dati nativi. Il metodo hashCode restituisce un valore intero che dipende dalla rappresentazione interna di un puntatore a un oggetto sull'heap. Il metodo getClass deve accedere allo vtbl interno (virtual function table) che rappresenta la gerarchia di classi del programma compilato. Nessuno di questi è possibile con il core Java.

+1

'Il metodo hashCode restituisce un valore intero dipendente dalla rappresentazione interna di un puntatore a un oggetto sull'heap. Ciò non sembra essere il caso guardando la [fonte] (http: //hg.openjdk. java.net/jdk8/jdk8/hotspot/file/tip/src/share/vm/runtime/synchronizer.cpp#l555). –

+0

@BrianAgnew Ehi, fratello, ho aggiornato il codice –

2

Le informazioni per questi sono nell'intestazione (per la classe) o altrove (per l'hashCode) Questo non è qualcosa che è possibile implementare in Java. L'origine di questi metodi è nell'origine della JVM. per esempio. è possibile scaricare la fonte per OpenJDK.

29

Il codice sorgente per la classe Object si trova here

Questa fonte contiene attuazione getClass() il metodo (vedi linea 58). hashCode è definito come un puntatore di funzione JVM_IHashCode (vedere la riga 43).

JVM_IHashCode è definito in jvm.cpp. Vedi codice a partire dalla riga 504. Questo a sua volta chiama ObjectSynchronizer :: FastHashCode che è definito in synchronizer.cpp. Vedere implementazione di FastHashCode alla riga 576 e get_next_hash alla riga 530.

Probabilmente, i metodi sono nativi per le prestazioni e per problemi pratici dell'implementazione di w.r.t.

Ad esempio, da javadocs, hashCode viene in genere implementato "convertendo l'indirizzo interno dell'oggetto in un numero intero". Questo indirizzo interno non è disponibile tramite java sdk e dovrà essere implementato come metodo nativo.

Leggere Is it possible to find the source for a Java native method?. Leggi anche questo post sul blog Object.hashCode implementation. Fornisce maggiori dettagli. Ma fa un'asserzione sbagliata che hashCode non è generato dall'identità dell'oggetto.

Spero che aiuti.

+0

Quindi come possiamo dire che JVM è indipendente dalla piattaforma? –

+0

In che modo questo romperebbe l'indipendenza dalla piattaforma? Per qualsiasi oggetto, hashCode non è richiesto per essere uguale su tutte le piattaforme. Del resto, non sarà nemmeno lo stesso sulla stessa piattaforma, attraverso diverse sessioni. Prova public class TestHashCode { public static void main (String [] args) { Object o = new Object(); System.out.println (o.hashCode()); } } – krishnakumarp

+1

@BhavikAmbani Questa è la terminologia di nitpicking, ma * JVM * non è indipendente dalla piattaforma, ma piuttosto dalla parte dipendente dalla piattaforma, che esegue il bytecode Java indipendente dalla piattaforma su una determinata piattaforma. – hyde

Problemi correlati