2012-12-27 26 views
5

Questa domanda è un follow-up a una domanda che ho trovato prima
java: get all variable names in a classCome variabili annotati da una classe

Quello che voglio è quello di ottenere le variabili da una classe, ma invece di tutti sempre, voglio solo il variabili che hanno l'annotazione @isSearchable.

Quindi, in pratica ho 2 domande:

  • Come si crea un'annotazione?

  • Come filtrare i miei campi solo con questa annotazione?

E un'altra cosa, se è qualcosa che sto usando spesso è consigliabile (sto cercando di indovinare riflessioni dovrebbero essere lento).

Grazie

+0

@TJCrowder non ero familiarità con annotazioni o se questo è un usa il caso per loro. Grazie a tutti per le vostre risposte, questo è stato davvero utile –

risposta

3
/** Annotation declaration */ 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.FIELD) 
public @interface isSearchable{ 
    //... 
} 

@isSearchable 
public String anyField = "any value"; 

controllo come:

//use MyClass.class.getDeclaredFields() if you want the fields only for this class. 
//.getFields() returns the fields for all the class hierarchy 
for(Field field : MyClass.class.getFields()){ 
    isSearchable s = field.getAnnotation(isSearchable.class); 
    if (s != null) { 
     //field has the annotation isSearchable 
    } else { 
     //field has not the annotation 
    } 
} 
+0

Ancora una domanda, è consigliabile usarlo solo per risparmiare un po 'di scrittura del codice ogni volta? –

+0

dipende, in genere dovremmo evitare di riflettere perché coinvolge il sovraccarico, ma se si guadagna molto in termini di manutenibilità/leggibilità/testabilità, penso che possiamo usarlo. e dovrebbe fare affidamento sui profiler per conoscere l'area per l'ottimizzazione, se necessario –

1

Field.getDeclaredAnnotations() ti dà le annotazioni per ogni campo.

Per rispondere alla domanda supplementare, normalmente mi aspetto che la riflessione sia lenta. Detto questo, forse non mi preoccuperei dell'ottimizzazione finché non diventerà un problema per te.

Suggerimento: assicurarsi di controllare lo up-to-date Javadoc. Google tende a darmi Java 1.4 Javadoc e le annotazioni non esistevano prima di Java 5.

2

Come filtrare i miei campi solo con questa annotazione?

È possibile ottenere da questo semplice frammento di

Field field = ... //obtain field object 
Annotation[] annotations = field.getDeclaredAnnotations(); 

for(Annotation annotation : annotations){ 
    if(annotation instanceof IsSearchable){ 
     MyAnnotation myAnnotation = (MyAnnotation) annotation; 
     System.out.println("name: " + myAnnotation.name()); 
     System.out.println("value: " + myAnnotation.value()); 
    } 
} 

Nel pezzo di codice sopra si sono fondamentalmente filtrando solo IsSearchable annotazioni.

quanto riguarda la tua domanda one more thing

Sì riflessione sarà lento come discusso here, se possibile evitare, vi consiglio di evitare.

2

Ecco un esempio

class Test { 
    @IsSearchable 
    String str1; 
    String str2; 

    @Target(ElementType.FIELD) 
    @Retention(RetentionPolicy.RUNTIME) 
    @interface IsSearchable { 
    } 

    public static void main(String[] args) throws Exception { 
     for (Field f : Test.class.getDeclaredFields()) { 
      if (f.getAnnotation(IsSearchable.class) != null) { 
       System.out.println(f); 
      } 
     } 
    } 
} 

stampe

java.lang.String Test.str1 
Problemi correlati