2012-12-27 17 views
5

To pytanie jest kontynuacją pytanie znalazłem przed
java: get all variable names in a classGetting adnotacją zmienne z klasy

Co chcę jest, aby zmienne z klasy, ale zamiast się ich wszystkich, chcę tylko zmienne, które mają adnotację @isSearchable.

Więc w zasadzie mam 2 pytania:

  • Jak mogę utworzyć adnotację?

  • Jak filtrować moje pola za pomocą tylko tej adnotacji?

I jeszcze jedno, jeśli jest to coś, czego często używam, to wskazane (domyślam się, że refleksy powinny być powolne).

Dziękuję

+0

@TJCrowder nie byłem obeznany z adnotacjami lub, jeśli jest to użyj przypadku dla nich. Dziękuję wszystkim za odpowiedzi, to było naprawdę pomocne –

Odpowiedz

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

@isSearchable 
public String anyField = "any value"; 

sprawdzenie jak:

//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

Jeszcze jedno pytanie, czy warto go używać, aby oszczędzać trochę pisania kodu za każdym razem? –

+0

Zależy, na ogół powinniśmy unikać refleksji, ponieważ wiąże się ona z kosztem ogólnym, ale jeśli wiele uzyskamy pod względem konserwacji/czytelności/testowalności, myślę, że możemy z niego korzystać. i powinien polegać na profilerach, aby w razie potrzeby znać obszar do optymalizacji –

1

Field.getDeclaredAnnotations() daje adnotacji dla każdego pola.

Aby odpowiedzieć na dodatkowe pytanie, normalnie spodziewam się, że refleks będzie powolny. Powiedziawszy to, być może nie martwię się o optymalizację, dopóki nie stanie się to problemem dla ciebie.

Wskazówka: Upewnij się, że sprawdzasz numer up-to-date Javadoc. Google zwykle daje mi Java Javadocs, a adnotacje nie istniały przed Java 5.

2

Jak filtrować moje pola tylko za pomocą tej adnotacji?

można uzyskać za pomocą tej prostej fragmencie

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()); 
    } 
} 

w powyższym snippet są w zasadzie tylko IsSearchable filtrowanie adnotacji.

Odnośnie zapytania one more thing

Tak odbicie będzie powolne jak omówiono here, jeśli jej uniknąć, radzę unikać.

2

Oto przykład

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); 
      } 
     } 
    } 
} 

drukuje

java.lang.String Test.str1 
Powiązane problemy