2009-02-18 8 views
8

Sto facendo an application server e in esso ho bisogno di usare qualche manipolazione bytecode (ad esempio inserendo i metodi personalizzati equals e hashCode in classi annotate con @Entity). Ora conferisco a JVM un Java Agent (l'opzione -javaagent) che esegue le trasformazioni bytecode utilizzando ASM.È possibile eseguire la manipolazione bytecode quando si utilizza OSGi?

Ho preso in considerazione l'utilizzo di OSGi, ma non so se mi consente di eseguire la manipolazione del codice byte necessaria.

  1. È possibile eseguire la manipolazione bytecode quando si utilizza OSGi? Come?
  2. È possibile che un bundle si dichiari, che richiede alcune manipolazioni del codice byte affinché funzioni? Ad esempio, il server delle applicazioni richiede che alcune delle sue classi principali vengano manipolate.
  3. È possibile specificare che un altro bundle richiede qualche manipolazione di codice, senza che il bundle ne sia a conoscenza? Ad esempio, tutte le applicazioni eseguite sul server devono essere manipolate, ma non è necessario che le applicazioni ne siano a conoscenza.
  4. E 'possibile che un bundle si dichiari, che tutti i pacchetti che dipendono da esso debbano essere manipolati in bytecode? Ciò mi renderebbe facile dichiarare che tutti coloro che dipendono dal pacchetto API che contiene l'annotazione @Entity devono essere manipolati.

risposta

3

1) Sì, è possibile eseguire la manipolazione bytecode in OSGi. Il modo in cui è un po 'diverso rispetto a Java standard, è necessario utilizzare il modello di estensione descrivere qui http://www.osgi.org/blog/2007/02/osgi-extender-model.html. Credo che Eclipse stia usando quello nel loro progetto di aspetto dell'equinozio: http://www.eclipse.org/equinox/incubator/aspects/. Spring DM utilizza definitivamente questo modello per la configurazione automatica del modulo osgi dm.

2) che corrisponderebbe al modello di estensione che si utilizza. È così che funziona l'estensore di primavera, cercando i file di configurazione nella cartella META-INF/spring di bundle prima che vengano avviati dalla piattaforma.

3) Di nuovo, questo dipenderebbe dall'estensione definita dall'utente.

4) Credo che ciò sarebbe possibile poiché prima che un bundle possa essere avviato, esso deve essere risolto e le dipendenze avviate, l'extender potrebbe quindi analizzare le dipendenze del bundle e avviare la manipolazione del codice byte.

+0

Il pattern extender su OSGi ha molto poco a che fare con la manipolazione del bytecode. Gli aspetti dell'Equinozio usano il modo equinox specifico di installare un gancio ondeggiante. Come accennato in seguito, dal 4.3 esiste un modo standard per farlo. – aav

+0

aav, capisco che il pattern extender ha poco a che fare con la manipolazione bytecode, quello a cui mi riferisco è un buon momento nel ciclo di vita dell'osgi per iniettare un meccanismo di manipolazione del codice byte. Ricorda anche che ho scritto questa risposta prima che OSGi 4.3 fosse effettivamente annunciato! È abbastanza chiaro che, poiché OSGi 4.3 supporta un'API reale, è quello che dovrebbe essere usato. Fare riferimento a "Sotto" è fuorviante poiché l'ordine di risposta può cambiare nel tempo (e la risposta corretta è ora sopra) –

6

OSGI 4.3 ha aggiunto WeavingHook che consente di eseguire la manipolazione del codice byte con un manipolatore di codice byte di propria scelta. Lo uso con JavaAssist su uno dei miei progetti e funziona alla grande.