2011-12-01 18 views
6

Ora mi sto concentrando su un progetto che richiede informazioni sul codice byte Java.Come identificare il metodo di override nel codice byte Java?

Con l'aiuto di bcel, ora posso completare la maggior parte del lavoro. Un punto che ora non sono chiaro è come identificare un metodo di sottoclasse che sovrascriva il suo codice base? C'è qualche attributo registrato nel file .class associato a un metodo che indica questa relazione di override o dovrei tornare indietro alla sua classe base in grado di confrontare le firme dei metodi?

Qualsiasi suggerimento sarà molto apprezzato.

risposta

5

È necessario cercare la catena gerarchica: non c'è nulla nel codice byte che indica che è un metodo sottoposto a override, perché non è necessario esserlo.

+0

Perché non è necessario? Quindi come JVM collega dinamicamente il file '. Class'? Ricerca la gerarchia inerente dal basso verso l'alto, finché non trova un metodo che corrisponde? Grazie. –

+1

@Summer_More_More_Tea Rifletti sulla domanda: perché * sarebbe * necessario? Se è un metodo della classe che stai guardando, perché la VM ha bisogno di sapere che è sovrascritta? –

+0

@DAVE suona a terra :) Grazie. –

-1

È possibile decompilarlo e caricare il codice come progetto nell'IDE di propria scelta. Normalmente puoi facilmente passare ai metodi sovrascritti dalla classe ereditaria.

+0

Grazie per la vostra risposta veloce. Ma come ottenere ciò con il codice Java? :) –

2

Se non si può fare affidamento sull'attributo @Override, sembra che in base allo the spec non ci sia altro modo per sapere guardando solo la classe. Penso che tu abbia bisogno di guardare le superclassi.

+4

'@ Override' ha la conservazione [SOURCE] (http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/annotation/RetentionPolicy.html#SOURCE). –

+0

@ DᴀᴠᴇNᴇᴡᴛᴏɴ: Grazie. – opqdonut

+0

@DAVE +1. grazie anche opqdonut per la risposta. –

2

Sfortunatamente, non è possibile indicarlo dal bytecode. L'annotazione @ Override è solo di tipo consultivo: non è obbligatoria.

La JVM definisce 5 modi di richiamare un metodo. Sono invocanti, invocate all'interfaccia, invocazioni speciali, invocastatiche e il nuovo invocato dinamico.

Focus su invokevirtual - è la forma più comune di spedizione ed è quella utilizzata per il caso di cui stai parlando qui.

Il modo in cui funziona invokevirtual è che in fase di esecuzione esamina la classe dell'oggetto su cui si sta effettuando la spedizione. Se trova un'implementazione del metodo che stiamo cercando, allora lo chiama. Altrimenti, guarda la superclasse della classe dell'oggetto e ci riprova, e così via.

Quindi non esiste alcun modo dal bytecode per stabilire in modo affidabile se un dato metodo è sovrascritto, senza guardare il bytecode per la classe genitore.

0

Il codice byte viene generato dopo la compilazione. Quindi, si presuppone che il metodo sia chiamato in base alla variabile di riferimento, poiché l'oggetto non è ancora stato creato.

Problemi correlati