2013-02-25 12 views
6

È possibile ereditare una classe finale utilizzando le manipolazioni di bytecode?E 'possibile ereditare una classe finale modificando il bytecode in qualche modo?

+1

La "composizione anziché l'ereditarietà" non risolve il problema? Potresti usare una classe wrapper per quello che stai cercando di fare? Per favore pubblica alcuni dettagli, è molto difficile consigliare qualcosa se sono disponibili così poche informazioni ... (e vikingsteve ha ragione!) – ppeterka

+5

'final' è di solito lì per un motivo ... – vikingsteve

+0

Quale classe stai provando a ereditato da? Uno di quelli standard della biblioteca? –

risposta

4

Sì e no.

È possibile utilizzare la manipolazione bytecode per modificare una classe final su non-final al volo. Questo non rompe nemmeno la compatibilità binaria, quindi non vi è alcun rischio di errori di loader/verificatore di classe.

Tuttavia, è necessario applicare le modifiche del codice bytecode alla classe final stessa. Non è possibile eseguire la manipolazione bytecode su una classe figlio per farla ereditare da una classe genitore final. O più precisamente, se lo fai, la classe figlia modificata verrà respinta dal verificatore quando caricata insieme alla classe genitore final.

+0

Se si desidera un riferimento specifico - sezione JVMS 4.1, pagina 73 - "Né la superclasse diretta né alcuna delle superclassi possono avere il flag ACC_FINAL impostato nell'elemento access_flags di nella struttura ClassFile." – Antimony

+0

Il JLS menziona anche questo - http://docs.oracle.com/javase/specs/jls/se7/html/jls-13.html#jls-13.4.2 –

+0

Ma la domanda posta sulla manipolazione del bytecode, nel qual caso il JLS è irrilevante. Il linguaggio Java ha tonnellate di restrizioni arbitrarie che non sono presenti a livello di bytecode. – Antimony

0

This descrive il formato del file di classe. All'offset 10+cpsize ci sono 2 byte che definiscono i flag di accesso di questa classe. Uno di questi flag si chiama ACC_FINAL (0x0010). Suppongo che tu possa mascherare quel bit e rendere quella classe non definitiva.

Problemi correlati