2011-09-04 4 views
6

Abbiamo una libreria di codice Java che intendiamo utilizzare tra i progetti. Alcuni di questi progetti richiedono l'aggiunta di annotazioni agli oggetti Java in questa libreria (ad esempio, in un progetto, questi oggetti verranno utilizzati in un'implementazione di servlet JAX-RS, quindi devono essere annotati con annotazioni JAXB, JSON, ecc.). Il problema che sto avendo è che non riuscivo a capire come aggiungere queste annotazioni senza cambiare la libreria originale.Aggiunta/modifica di annotazioni in un progetto java

Considerate questo esempio:

public class MyClass 
{ 
    private String field1; 
    private int field2; 
} 

In alcuni progetti, vorrei classe a comportarsi come se fosse

public class MyClass 
{ 
    @Annotation1 
    private String field1; 
    @Annotation2 
    private int field2; 
} 

Inizialmente ho pensato di usare interfacce o classi derivate che vengono annotati separatamente ma non riuscivo a capire come farlo (o se sia possibile o meno). Ho anche trovato il suggerimento Javassist in this thread (cioè l'approccio di manipolazione bytecode Java) ma il problema è che questo deve funzionare anche sui client Android, quindi non è un'opzione per me. A questo punto sono fuori di idee.

Sarei grato se qualcuno potesse aiutare in qualsiasi modo. Forse mi manca qualcosa, o forse quello che sto cercando di fare non è la strada giusta. In ogni caso, ho bisogno di una guida ora per poter procedere.

Grazie mille in anticipo.

+0

Qual è il problema con il cambiamento della libreria originale? È il tuo codice, vicino come posso dire. – CommonsWare

+0

La libreria gestisce un gruppo di oggetti, le loro raccolte e la funzionalità CRUD in memoria (vincoli, convalida ecc.). Non ha alcuna conoscenza di serializzazione e persistenza di questi oggetti, e mi piacerebbe tenerli separati.Inoltre, le annotazioni non disponibili possono causare problemi sulla piattaforma di destinazione: Android non ha le annotazioni JAXB e qualsiasi framework che elabora le annotazioni non riesce su Android anche se le annotazioni JAXB non vengono utilizzate (NoClassDefFoundError). Vorrei evitare di aggiungere annotazioni se non verranno utilizzate dalla piattaforma di destinazione. – alokoko

risposta

4

Ho guardato in questo sempre come una sintesi, ecco cosa ho trovato:

  • linguaggio Java non permette di cambiare le annotazioni durante il runtime.
  • Si può usare Javassist per modificare il codice byte java ma non funziona su piattaforme come Android.
  • Uno può utilizzare ASM ma quello riguarda l'assembly Java (un esempio è qui: http://community.jboss.org/thread/150002).

Principalmente a causa del fatto che JAXB non è presente su Android (e altri motivi) siamo passati a JSON e iniziamo a usare Jackson come implementazione. Uno dei vantaggi di questo cambiamento è stata la possibilità di utilizzare ciò che Jackson chiama "annotazioni miste" che è esattamente quello che stavo cercando.

Ecco il link che spiega più: http://www.cowtowncoder.com/blog/archives/2009/08/entry_305.html

0

A corto di hacking del codice byte .class durante il runtime, questo non può essere fatto. Puoi usare Javassist se vuoi davvero modificare dinamicamente il bytecode delle classi della libreria durante il runtime, ma nell'immagine più grande questo probabilmente finirà con lo scoppiare male.

Suggerisco di annotare semplicemente la libreria e ricompilare se è il codice base. Se non lo è, puoi comunque racchiudere le classi/le interfacce della libreria nelle tue classi/interfacce tramite l'ereditarietà e annotare lì. Ad ogni modo, penso che sarebbe meglio annotare nel codice piuttosto che attraverso l'hacking bytecode di runtime. Aggiunto bonus, le annotazioni nella fonte saranno viste dagli IDE, consentendo all'IDE di assisterti meglio.

+0

Vedere il mio commento alla domanda. Conosco già Javassist, ma ho bisogno che funzioni anche sulla piattaforma Android e Javassist non funziona su Android. – alokoko