2011-09-22 8 views
13

Sono abbastanza nuovo per i termini di annotazione. Ho letto alcune fonti e sono giunto alla conclusione che non ha risposto alla mia domanda. Forse ho cercato su Google usando la ricerca sbagliata. Forse trascuro, o forse sono solo all'oscuro ..L'annotazione Java esegue un metodo all'interno della dichiarazione di annotazione (utilizzo per Android)

Comunque, ecco l'accordo.

Sono occupato a scrivere un'applicazione che richiede "validazione ruolo".

Per fare ciò, desidero utilizzare un'annotazione.

Quindi qualcosa lungo la linea del:

@interface Validate(){ 

} 

Quello che mi propongo di raggiungere è sometihng lungo le linee di:

public @interface Validate() { 
    public Validate() { 
     //Do validation stuff 
    return true/false 
    } 
} 

Quindi, fondamentalmente voglio definire metodi all'interno l'annotazione. Voglio essere in grado di chiamare

@Validate 
public void methodThatRequiresAdminRole() { 
    doStuff(); 
} 

Solo gli amministratori dovrebbero essere in grado di entrare in questo metodo. In caso contrario, dovrebbe essere generato un errore.

quindi se @validate restituisce true, il metodo deve essere eseguito

Scusate se sono davvero poco chiaro. Non sono abbastanza sicuro di come chiedere correttamente ciò che voglio. Quindi spero che gli esempi raccontino le storie.

Spero di leggere suggerimenti e forse anche una risposta al più presto. Grazie.

** EDIT **

ho bisogno di sottolineare il fatto che il codice deve essere utilizzato su un'applicazione Android. Quindi preferisco non usare strani framework non pensati per Android. Non ho problemi ad aggiungere una libreria personalizzata che fornisce la funzionalità senza alcun tipo di framework applicativo.

risposta

19

Le annotazioni sono metadati. Quello che devi scrivere è un processore di annotazione. Un'annotazione in sé non può realizzare la logica di validazione. Il processore di annotazione esaminerà le annotazioni e quindi eseguirà la convalida e controllerà il flusso dell'applicazione. Questa risposta SO ha una buona spiegazione Can Java Annotations help me with this?

È inoltre necessario annotare l'annotazione con @Retention (RetentionPolicy.RUNTIME) in modo che le informazioni di annotazione siano conservate fino al runtime.

@Retention(RetentionPolicy.RUNTIME) 
public @interface Validate() { 
}
+0

Grazie per il vostro consiglio e il collegamento. So cosa fare per il mio prossimo passo. Quindi sono stato aiutato. –

+0

Prego. Dai un'occhiata anche a questo link per l'implementazione di un semplice processore di annotazioni http://www.horstmann.com/corejava/cj7v2ch13ex.pdf. –

0

Non penso che sia possibile ottenere ciò con le annotazioni da solo. Sono pensati per fornire meta informazioni sugli elementi del codice e non sulla logica di elaborazione. Per implementare effettivamente la restrizione sul richiamo dei metodi annotati è necessario controllare l'accesso manualmente all'interno o all'esterno del metodo o iniettare tale controllo utilizzando qualcosa come http://www.eclipse.org/aspectj/

+0

nel caso in cui si hanno familiarità con .NET. Sto cercando "attributi" Ero/sono convinto che sia esattamente ciò che è un'annotazione. Potrei sbagliarmi in questo caso? Mi è appena venuto in mente. Grazie per la tua risposta btw. Sembra che non possa essere raggiunto. Lascerò passare qualche minuto, vedere quali risposte compaiono. Altrimenti segnerò questo. –

+0

@Joey AspectJ può essere utilizzato per lo sviluppo di Android, ma è limitato a utilizzare la tessitura del tempo di compilazione, il che significa che puoi controllare solo l'esecuzione dei metodi per i quali hai il codice sorgente. – Gandalf

+0

@Joey Sì Le annotazioni Java sono l'equivalente di .NET Attributes. È possibile aggiungere annotazioni ai metodi e queste annotazioni possono contenere dati, ma non elaborare la logica che viene eseguita su una chiamata al metodo, ad esempio. Questa è più la preoccupazione di un cosiddetto aspetto nei termini di AOP. – Gandalf

2

Nota, questo potrebbe essere abbastanza fuori tema.Utilizzando spring AOP con, l'elaborazione delle annotazioni è abbastanza semplice:

Creare un aspetto:

@Aspect 
public class RoleCheckAspect { 
    @Before("@annotation(your.package.Validate)") 
    public void doAccessCheck() throws Exception { 
    // Do validation stuff 
    if (!valid) 
     throw new IllegalAccessException("foo"); 
    } 
    } 
} 

Set-up vostro aspetto:

In META-INF/aop.xml

<!DOCTYPE aspectj PUBLIC 
    "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd"> 
<aspectj> 
    <weaver> 
    <!-- only weave classes in our application-specific packages --> 
    <include within="your.package..*" /> 
    </weaver> 
    <aspects> 
    <!-- weave in just this aspect --> 
    <aspect name="com.bac.bsl.nonproc.TestAspect" /> 
    </aspects> 
</aspectj> 

Setup load time weaving

In primavera context:

<context:load-time-weaver/> 

Assicurarsi che la molla-agent è avviato con la vostra applicazione:

java -javaagent:/path/to/spring-agent.jar -classpath $CP your.package.MyApp 
Problemi correlati