2016-05-30 3 views
0

Я использую отражение, поэтому я могу проверить, есть ли у некоторых полей в другом классе аннотации. классКак проверить, имеет ли поле аннотацию при использовании отражения

DummyUser:

package com.reflec.models; 

public class DummyUser { 

@NotNull 
private String firstName; 

private String lastName; 

@NotNull 
private String email; 

public DummyUser() { 

} 

public DummyUser(String firstName, String lastName, String email) { 
    this.firstName = firstName; 
    this.lastName = lastName; 
    this.email = email; 
} 

Основной класс:

public static void main(String[] args) { 
    DummyUser user = new DummyUser(); 

    List<Field> list = seekFieldsWithAnnotations(user);   
    System.out.println("Size: " + list.size()); 
} 

public static List<Field> seekFieldsWithAnnotations(Object o) { 
    Class<?> clss = o.getClass(); 
    List<Field> fieldsWithAnnotations = new ArrayList<>(); 

    List<Field> allFields = new ArrayList<>(Arrays.asList(clss.getDeclaredFields())); 
    for(final Field field : allFields) { 
     if(field.isAnnotationPresent((Class<? extends Annotation>) clss)) { 
      Annotation annotInstance = field.getAnnotation((Class<? extends Annotation>) clss); 
      if(annotInstance.annotationType().isAnnotation()) { 
       fieldsWithAnnotations.add(field); 
      } 
     } 
    } 
    //clss = clss.getSuperclass(); 
    return fieldsWithAnnotations; 
} 

Если я получить размер списка, возвращаемого seekFieldsWithAnnotations, размер всегда равен 0. Когда на самом деле я ожидал должно быть 2, потому что поля firstName и email имеют аннотации над ними.

Если я возвращаю список allFields и получаю его размер, я возвращаюсь 3, потому что в классе DummyUser есть три поля.

Так что я думаю, что место, где я неправильно это

for(final Field field : allFields) { 
    // Here I am trying to check if annotations are present 
    if(field.isAnnotationPresent((Class<? extends Annotation>) clss)) { 
     Annotation annotInstance = field.getAnnotation((Class<? extends Annotation>) clss); 
     if(annotInstance.annotationType().isAnnotation()) { 
      fieldsWithAnnotations.add(field); 
     } 
    } 
} 

ответ

0

мне удалось получить эту работу, используя этот код.

public static StringBuilder seekFieldsWithAnnotations(Object object) { 
    Class<?> c = object.getClass(); 

    StringBuilder sb = new StringBuilder(); 

    Field[] fieldsArr = c.getDeclaredFields(); 
    List<Field> allFields = new ArrayList<>(Arrays.asList(fieldsArr)); 

    for(Field field : allFields) { 
     if(field.getDeclaredAnnotations().length > 0) { 
      Annotation[] fieldAnnots = field.getDeclaredAnnotations(); 

      sb.append("Field Name: " + field.getName() + "\nAnnotations: "); 
      for(int i = 0; i < fieldAnnots.length; i++) { 
       if(fieldAnnots.length == 1 || fieldAnnots.length - i == 1) { 
        sb.append(fieldAnnots[i].toString() + "\n\n"); 
       } else { 
        sb.append(fieldAnnots[i].toString() + ", "); 
       } 
      } 
     } else { 
      System.out.println("\"" + field.getName() + "\" has no annotations.\n"); 
     } 
    } 
    return sb; 
} 
0

Вы хотите позвонить getDeclaredAnnotations() для того, чтобы принести все объявлены аннотаций для каждого из полей. В javadoc также четко указано, что вы используете getAnnotation() не в том направлении. Этот метод предполагает, что вы пройдете класс аннотации ; но вы передаете ему класс окружающего объекта.

0

Как уже указано @ Jägermeister, вы должны использовать getDeclearedAnnotations.

Вы можете упростить код следующим образом:

public static List<Field> seekFieldsWithAnnotations(Object o) { 
    List<Field> fieldsWithAnnotations = new ArrayList<>(); 
    for (final Field field : o.getClass().getDeclaredFields()) { 
     Annotation[] declaredAnnotations = field.getDeclaredAnnotations(); 
     if (declaredAnnotations.length > 0) { 
      fieldsWithAnnotations.add(field); 
     } 
    } 
    return fieldsWithAnnotations; 
} 
+0

Я пробовал это, но 'getDeclaredAnnotations()' ничего не возвращает вообще. Таким образом, 'declAnnotations' заканчивается значением null. – ASmoothNoble

Смежные вопросы