2013-07-01 9 views
10

In questi giorni ho giocato con Java reflection e il formato .class. Attualmente sto studiando l'istruzione ldc.Riferimenti simbolici in Java

Nella specifica JVM ho trovato il termine non capisco: riferimento simbolico e ho le seguenti domande.

  1. Che cosa significa?

  2. Dove viene utilizzato?

  3. In quali casi l'istruzione ldc carica un riferimento simbolico?
  4. C'è qualche codice in Java corrispondente a tale azione?

risposta

16

Sarebbe utile se si citasse il pezzo esatto della documentazione che ti dà problemi. Dal momento che non hai, ho intenzione di prendere una supposizione a quello che si potrebbe avere citato, dal doc per ldc:

In caso contrario, se la voce pool di costanti in fase di esecuzione è un riferimento simbolico ad un classe (§5.1), quindi la classe denominata è risolta (§5.4.3.1) e un riferimento all'oggetto Class che rappresenta tale classe, il valore è inserito nella pila degli operandi.

caso contrario la voce pool di costanti runtime deve essere un simbolico riferimento ad un tipo di metodo o una maniglia metodo (§5.1). ...

Questa citazione è un collegamento ad un'altra sezione della specifica JVM (5.1), che descrive il run-time pool di costanti:

una struttura di dati di runtime che serve molte delle ai fini della tabella simbolo di un'implementazione tradizionale linguaggio di programmazione

ciò significa che il run-time pool di costanti contiene informazioni sulle parti di una classe in forma simbolica: come valori di testo.

Quindi, quando ldc viene assegnato un "riferimento simbolico" a una classe, viene fornito l'indice di una struttura CONSTANT_Class_info all'interno del pool costante. Se guardi la definizione di questa struttura, vedrai che contiene un riferimento al nome della classe, anch'esso contenuto nel pool costante.

TL; DR: "riferimenti simbolici" sono stringhe che possono essere utilizzate per recuperare l'oggetto reale.


Un esempio:

if (obj.getClass() == String.class) { 
    // do something 
} 

Diventa la seguente bytecode:

aload_1 
invokevirtual #21; //Method java/lang/Object.getClass:()Ljava/lang/Class; 
ldc  #25; //class java/lang/String 
if_acmpne  20 

In questo caso, l'operazione ldc riferisce ad una classe che viene memorizzato simbolicamente.Quando JVM esegue questo codice operativo, utilizzerà il riferimento simbolico per identificare la classe effettiva all'interno del classloader corrente e restituire un riferimento all'istanza della classe.

+0

E quando viene utilizzato? Quando si ha bisogno di una cosa del genere? – user35443

+0

@ user35443 - Per la stessa ragione per cui si scrive codice usando variabili con nomi, piuttosto che indirizzi di memoria espliciti. – parsifal

+0

Avete qualche esempio di codice Java dove l'istruzione 'ldc' è usata con il link simbolico? Non riesco a immaginare caso in cui questo deve essere usato. – user35443

Problemi correlati