2016-07-17 1 views
0

J'ai créé une simple classe d'annotation:Comment obtenir le terrain d'une classe par son annotation

@Retention(RUNTIME) 
public @interface Column { 
    public String name(); 
} 

Je l'utilise dans certaines classes comme ceci:

public class FgnPzt extends Point { 

    public static final String COLUMN_TYPE = "type"; 
    @Column(name=COLUMN_TYPE) 
    protected String type; 

} 

Je sais que je peux itérer les champs déclarés et obtenir l'annotation comme ceci:

for (Field field : current.getDeclaredFields()) { 
    try { 
     Column c = field.getAnnotation(Column.class); 
     [...] 
    } catch(Exception e) { 
     [...] 
    } 
} 

Comment puis-je obtenir le champ type directl Y par son nom annoté sans itération sur les champs déclarés de la classe?

+1

En regardant l'API 'Class', je dirais que non, l'itération sur les champs est le seul moyen. Est-ce un problème pour vous? – Dici

+0

J'ai des cours avec environ vingt/trente champs et j'ai besoin d'accéder à tous les domaines à chaque fois. Si je parcourt chaque champ à chaque fois, j'aurai une complexité n * – Lipsyor

+0

Vous pouvez utiliser 'field.isAnnotationPresent (Column.class);' pour vérifier chaque champ. –

Répondre

2

Si vous devez effectuer plusieurs accès, vous pouvez pré-traiter les annotations.

public class ColumnExtracter<T> { 
    private final Map<String, Field> fieldsByColumn; 

    public ColumnExtracter(Class<T> clazz) { 
     this.fieldsByColumn = Stream.of(clazz.getDeclaredFields()) 
       .filter(field -> field.isAnnotationPresent(Column.class)) 
       .collect(Collectors.toMap(field -> field.getAnnotation(Column.class).name(), Function.identity())); 
    } 

    public Field getColumnField(String columnName) { 
     return fieldsByColumn.get(columnName); 
    } 

    public <R> R extract(String columnName, T t, Class<R> clazz) throws IllegalAccessException { 
     return clazz.cast(extract(columnName, t)); 
    } 

    public Object extract(String columnName, T t) throws IllegalAccessException { 
     return getColumnField(columnName).get(t); 
    } 
}