Как получить annotations переменной-члена?

Я хочу знать annotations некоторых переменных переменной classа, я использую BeanInfo beanInfo = Introspector.getBeanInfo(User.class) для интроспекции classа и использования BeanInfo.getPropertyDescriptors() для поиска определенного свойства и использования classа type = propertyDescriptor.getPropertyType() чтобы получить class свойства.

Но я не знаю, как добавить annotations к переменной-члену?

Я попробовал type.getAnnotations() и type.getDeclaredAnnotations() , но оба возвращают annotations classа, а не то, что я хочу. Например :

 class User { @Id private Long id; @Column(name="ADDRESS_ID") private Address address; // getters , setters } @Entity @Table(name = "Address") @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) class Address { ... } 

Я хочу получить аннотацию адреса: @Column, а не annotations Address (@Entity, @Table, @Cache). Как его достичь? Благодарю.

8 Solutions collect form web for “Как получить annotations переменной-члена?”

 for(Field field : cls.getDeclaredFields()){ Class type = field.getType(); String name = field.getName(); Annotation[] annotations = field.getDeclaredAnnotations(); } 

См. Также: http://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html

Все описывают проблему с получением аннотаций, но проблема заключается в определении вашей annotations. Вы должны добавить в свое определение annotations значение @Retention(RetentionPolicy.RUNTIME) :

 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface MyAnnotation{ int id(); } 

Если вам нужно знать, присутствует ли конкретная аннотация. Вы можете сделать это:

  Field[] fieldList = obj.getClass().getDeclaredFields(); boolean isAnnotationNotNull, isAnnotationSize, isAnnotationNotEmpty; for (Field field : fieldList) { //Return the boolean value isAnnotationNotNull = field.isAnnotationPresent(NotNull.class); isAnnotationSize = field.isAnnotationPresent(Size.class); isAnnotationNotEmpty = field.isAnnotationPresent(NotEmpty.class); } 

И так далее для других аннотаций …

Я надеюсь помочь кому-то.

Вы должны использовать рефлексию, чтобы получить все поля членов classа User , перебирать их и находить их annotations

что-то вроде этого:

 public void getAnnotations(Class clazz){ for(Field field : clazz.getDeclaredFields()){ Class type = field.getType(); String name = field.getName(); field.getDeclaredAnnotations(); //do something to these } } 

Вы можете получить annotations к методу getter:

 propertyDescriptor.getReadMethod().getDeclaredAnnotations(); 

Получение аннотаций частного поля кажется плохой идеей … что, если свойство даже не поддерживается полем или не поддерживается полем с другим именем? Даже игнорируя эти случаи, вы нарушаете абстракцию, глядя на частные вещи.

 package be.fery.annotation; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.PrePersist; @Entity public class User { @Id private Long id; @Column(name = "ADDRESS_ID") private Address address; @PrePersist public void doStuff(){ } } 

И class тестирования:

  package be.fery.annotation; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Method; public class AnnotationIntrospector { public AnnotationIntrospector() { super(); } public Annotation[] findClassAnnotation(Class< ?> clazz) { return clazz.getAnnotations(); } public Annotation[] findMethodAnnotation(Class< ?> clazz, String methodName) { Annotation[] annotations = null; try { Class< ?>[] params = null; Method method = clazz.getDeclaredMethod(methodName, params); if (method != null) { annotations = method.getAnnotations(); } } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } return annotations; } public Annotation[] findFieldAnnotation(Class< ?> clazz, String fieldName) { Annotation[] annotations = null; try { Field field = clazz.getDeclaredField(fieldName); if (field != null) { annotations = field.getAnnotations(); } } catch (SecurityException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } return annotations; } /** * @param args */ public static void main(String[] args) { AnnotationIntrospector ai = new AnnotationIntrospector(); Annotation[] annotations; Class userClass = User.class; String methodDoStuff = "doStuff"; String fieldId = "id"; String fieldAddress = "address"; // Find class annotations annotations = ai.findClassAnnotation(be.fery.annotation.User.class); System.out.println("Annotation on class '" + userClass.getName() + "' are:"); showAnnotations(annotations); // Find method annotations annotations = ai.findMethodAnnotation(User.class, methodDoStuff); System.out.println("Annotation on method '" + methodDoStuff + "' are:"); showAnnotations(annotations); // Find field annotations annotations = ai.findFieldAnnotation(User.class, fieldId); System.out.println("Annotation on field '" + fieldId + "' are:"); showAnnotations(annotations); annotations = ai.findFieldAnnotation(User.class, fieldAddress); System.out.println("Annotation on field '" + fieldAddress + "' are:"); showAnnotations(annotations); } public static void showAnnotations(Annotation[] ann) { if (ann == null) return; for (Annotation a : ann) { System.out.println(a.toString()); } } } 

Надеюсь, поможет…

😉

Мой путь

 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; public class ReadAnnotation { private static final Logger LOGGER = LoggerFactory.getLogger(ReadAnnotation.class); public static boolean hasIgnoreAnnotation(String fieldName, Class entity) throws NoSuchFieldException { return entity.getDeclaredField(fieldName).isAnnotationPresent(IgnoreAnnotation.class); } public static boolean isSkip(PropertyDescriptor propertyDescriptor, Class entity) { boolean isIgnoreField; try { isIgnoreField = hasIgnoreAnnotation(propertyDescriptor.getName(), entity); } catch (NoSuchFieldException e) { LOGGER.error("Can not check IgnoreAnnotation", e); isIgnoreField = true; } return isIgnoreField; } public void testIsSkip() throws Exception { Class entity = TestClass.class; BeanInfo beanInfo = Introspector.getBeanInfo(entity); for (PropertyDescriptor propertyDescriptor : beanInfo.getPropertyDescriptors()) { System.out.printf("Field %s, has annotation %b", propertyDescriptor.getName(), isSkip(propertyDescriptor, entity)); } } } 

Или вы можете попробовать это

 try { BeanInfo bi = Introspector.getBeanInfo(User.getClass()); PropertyDescriptor[] properties = bi.getPropertyDescriptors(); for(PropertyDescriptor property : properties) { //One way for(Annotation annotation : property.getAnnotations()){ if(annotation instanceof Column) { String string = annotation.name(); } } //Other way Annotation annotation = property.getAnnotation(Column.class); String string = annotation.name(); } }catch (IntrospectonException ie) { ie.printStackTrace(); } 

Надеюсь, это поможет.

  • Установить свойство объекта с помощью отражения
  • Как получить доступ к внутреннему classу с помощью Reflection
  • Получить имя свойства как строку
  • Замена строк в java, аналогично шаблону скорости
  • Печать отладочной информации об ошибках с помощью java 8 lambda-выражений
  • Использование отражения для изменения статического финального файла File.separatorChar для модульного тестирования?
  • Как вызвать метод Scala Object с использованием отражения?
  • Как я могу получить значение свойства string через Reflection?
  • Каков наилучший способ получить объект classа для типа массива?
  • GetEntryAssembly для веб-приложений
  • Как перебрать все свойства classа?
  • Interesting Posts

    Вход и выход в систему аутентификации ASP.NET с кнопкой назад

    Мой диск Western Digital 500GB Passport говорит «не отформатирован», когда я подключаю его в Windows

    Добавление прокручиваемой JTextArea (Java)

    Какова максимальная длина в символах, необходимых для представления любого двойного значения?

    Несмотря на то, что GIT НЕ хранит дельта файлов, можете ли вы откатить предыдущие версии файлов (неограниченное время?)

    установка аудиофайла в качестве мелодии звонка

    Notepad ++ Выполнить текущую строку в командной строке

    Присоедините несколько файлов MP3 (без потерь)

    Разница между прокси-сервером и обратным прокси-сервером

    FileZilla в Mac OS X не может открыть .ssh-каталог, чтобы получить мой ключевой файл

    Должен ли я получить запись базы данных на уровне слоев Struts2?

    Как «предупреждение о безопасности Windows» вы хотите запустить этот файл .. »работают?

    Правильное использование strtol

    Как увеличить размер виртуального бокса?

    Как изменить цвет заголовка панели действий в коде

    Давайте будем гением компьютера.