2009-07-16 14 views
9

Mi rendo conto che questa potrebbe essere una domanda che è stata posta e risposta, ma per favore portami con me.È possibile utilizzare annotazioni per l'iniezione di codice?

Desidero sapere se è possibile utilizzare le annotazioni per inserire il codice nel tempo di compilazione delle classi. L'esempio classico è generare un getter e setter per i membri del tuo oggetto. Questo non è esattamente ciò di cui ho bisogno, ma serve per illustrare l'idea di base.

Ora su internet la risposta di base non ottengo alcuna è, ma questo ragazzo lo ha fatto:

link text

Qualcuno sa come si fa quello che fa (e se lui in realtà fa quello che dice fa)?

La cosa principale è che non usa un processore di annotazioni per generare un nuovo file java da compilare. Questa tecnica di cui sono a conoscenza e non funzionerà per il nostro scopo.

Grazie

+0

Immagino che potrebbe fare questo http://jcp.org/en/jsr/detail?id=269? – Chii

risposta

5

Non è supportato per modificare il codice in fase di compilazione ma sembra essere possibile utilizzando API non supportati javac-interna, here è un post riferimento alla soluzione hanbuy-panno con anche un collegamento alla code ...

+0

Grazie mille. Quel secondo collegamento è esattamente quello che stavo cercando. Ora posso vedere come lo fa e decidere se è una buona o cattiva idea farlo in quel modo. –

+0

Questi collegamenti non funzionano più. C'è uno specchio? –

1

qualcosa deve elaborare le annotazioni, in modo che sia accade al momento della compilazione di un processore annotazione o in fase di esecuzione con la riflessione (sì, lo so, ci sono anche modi più esotici di farlo in fase di esecuzione).

Sta sicuramente utilizzando un processore di annotazioni, è solo che è implicito. Il comando javac cercherà il percorso della classe per i processori di annotazione se non impostato esplicitamente.

Dato che usa questo comando per compilare:

javac -cp ~/development/panno/build/hanhuy-panno.jar *.java

Vediamo ha modificato il percorso della classe per includere la hanhuy-panno.jar, che conterrà il processore annotazione.

Perché non mandare semplicemente un'email al ragazzo e chiedere se ti darà il codice?

+0

Sì, mi rendo conto che lo fa usando un processore di annotazioni, la domanda è più ciò che fa in esso. L'ho spedito, ma non ho ancora ricevuto una risposta. Grazie –

3

Sono andato a cercare lo something similar l'anno scorso. Non esiste un modo standard per modificare le classi utilizzando i processori di annotazione o il compilatore e la documentazione dell'API di annotazione consiglia di creare decoratori.

Se si è disposti a convivere con gli hack, dare un'occhiata all'API privato di Adrian Kuhn dove ha adds Roman numeral literals to Java. Questo approccio è limitato al compilatore javac Sun e sarà necessario implementare qualcos'altro se ne è stato fatto un altro (come il compilatore Eclipse).


Edit: chiunque sia interessato a questo settore dovrebbe verificare Project Lombok.

+0

Ah, capisco cosa intendi per limitarti a un determinato compilatore. Questo potrebbe essere un problema. Grazie per la risposta. –

2

È possibile eseguire questa operazione, ma non è necessario modificare la classe contenente le annotazioni. (Il trucco a cui si fa riferimento utilizza la api dell'albero di compilazione per modificare il bytecode generato ...) Questo non è supportato e sarà probabilmente protetto nei successivi SDK Java.

Il modo corretto per farlo è generare una classe superclasse, sottoclasse o wrapper.

Ho scritto una serie di annotazioni che generano getter/setter e altre cose divertenti. Genero una superclasse.

Vedi http://code.google.com/p/javadude/wiki/Annotations

Si possono fare cose come

package sample; 

import com.javadude.annotation.Bean; 
import com.javadude.annotation.Property; 
import com.javadude.annotation.PropertyKind; 

@Bean(properties={ 
    @Property(name="name"), 
    @Property(name="phone", bound=true), 
    @Property(name="friend", type=Person.class, kind=PropertyKind.LIST) 
}) 
public class Person extends PersonGen { 
} 

e si metterà a generare PersonGen per voi con i campi/getter/setter e il supporto di proprietà legato.

+0

Grazie per la risposta, ma come ho affermato nella mia domanda iniziale, la generazione di altri file java non è una soluzione ideale nel nostro caso. Anche se, sono d'accordo sul fatto che l'utilizzo della aula dell'albero compilato non sia l'ideale. –

+0

Qualche ragione particolare, il codice gen non funzionerà per te? Tieni presente che non solo l'albero del codice non è ideale per questo scopo, è esplicitamente dichiarato nei documenti APT che è illegale. –

Problemi correlati