2013-10-07 22 views
5

Quindi, per questo progetto sto cercando di estendere una classe in fase di esecuzione. Quello che mi piacerebbe sapere, è anche possibile? Se sì, come lo farei? Ci sono biblioteche là fuori per queste cose?Estendere classe in fase di esecuzione

+0

Perché mai vorresti farlo? Si prega di chiarire il caso d'uso. Dubito che sia possibile. –

risposta

4

CGLib è una libreria che stai cercando. È piuttosto potente nell'estendere le classi o nell'implementare interfacce in runtime, quindi molti framework popolari, come Spring o Hibernate, lo usano.

È possibile creare un'estensione classe con il codice come

public Object createProxy(Class targetClass) { 
    Enhancer enhancer = new Enhancer(); 
    enhancer.setSuperclass(targetClass); 
    enhancer.setCallback(NoOp.INSTANCE); 
    return enhancer.create(); 
    } 

anche se si sarebbe probabilmente sostituire NoOp callback con un metodo utile intercettore con la logica desiderata.

+0

Fantastico, grazie! – PaulBGD

1

Sì, è possibile estendere una classe in fase di esecuzione. Prova una libreria che sia in grado di modificare il bytecode in fase di esecuzione come ad es. javassist o ASM.

0

La risposta dipende da cosa si intende con "estendere una classe". In java "estendere" significa dichiarare un'altra classe che estende la prima (è una sottoclasse). Quindi, se si desidera creare una sottoclasse di una data classe, ciò è possibile - basta preparare un array di byte che rappresenta la sottoclasse e passarlo a un programma di caricamento classi.

Se si desidera aggiungere campi o metodi a una classe esistente, ciò è possibile solo nel momento in cui questa classe viene caricata e viene eseguita sostituendo la rappresentazione di matrice di byte. Se la classe è già stata caricata, non è possibile modificarla in alcun modo.

+0

Stavo solo cercando di scegliere quale classe estendere (dato che il classpath della classe cambia costantemente). – PaulBGD