2012-12-20 3 views
0

У меня есть ряд классов, которые не связаны. Каждый класс имеет одно свойство с и @PrimaryKey (с геттером и сеттер), которое может быть любого типа. Как я могу использовать отражение, чтобы найти, какое свойство экземпляра любого класса имеет аннотацию @PrimaryKey, поэтому я могу получить его значение как строку.Как найти, какая функция java bean имеет известную аннотацию

код не знает, какой тип класса его передается - это будет просто типа «Object»

ответ

2

Вы можете сделать что-то вроде этого:

for (Field field : YourClass.class.getDeclaredFields()) { 
    try { 
     Annotation annotation = field.getAnnotation(PrimaryKey.class); 
     // what you want to do with the field 
    } catch (NoSuchFieldException e) { 
     // ... 
    } 
} 

Если вы работаете с экземпляр вашего класса, то вы можете сделать это, чтобы получить его class объект:

Class<?> clazz = instance.getClass(); 

поэтому первая линия становится чем-то вроде этого:

instance.getClass().getDeclaredFields() 

Если у вас есть проблемы, вы всегда можете обратиться к официальному лицу documentation. Я считаю, что это неплохо.

+0

Спасибо - это выглядит близко к тому, что мне нужно, но мне нужно работать с экземпляром класса (т.е. объект) - и код обыкновение знать, какой класс (типа) объекта. – nwaltham

+0

Но вы можете спросить его через instance.getClass() –

2

Вы можете получить все поля класса, а затем итерацию и найти какое поле имеет аннотацию:

Field[] fields = YourClass.class.getDeclaredFields(); 
for (Field field : fields) { 
    Annotation annot = field.getAnnotation(PrimaryKey.class); 
    if (annot != null) { 
     System.out.println("Found! " + field); 
    } 
} 
+0

Спасибо - это похоже на то, что мне нужно, но мне нужно работать из экземпляра класса (т.е. объекта) - и код не знает, какой класс (тип) объекта. – nwaltham

-1

Прежде всего вам нужно найти все классы, которые могут иметь аннотацию в их членов. Это может быть достигнуто с помощью Spring Framework ClassUtils:

public static void traverse(String classSearchPattern, TypeFilter typeFilter) { 
    ClassLoader classLoader = ClassUtils.getDefaultClassLoader(); 
    ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver(classLoader); 

    Resource[] resources = null; 
    try { 
     resources = resourceResolver.getResources(classSearchPattern); 
    } catch (IOException e) { 
     throw new FindException(
       "An I/O problem occurs when trying to resolve resources matching the pattern: " 
         + classSearchPattern, e); 
    } 

    MetadataReaderFactory metadataReaderFactory = new SimpleMetadataReaderFactory(); 

    for (Resource resource : resources) { 
     try { 
      MetadataReader metadataReader = metadataReaderFactory.getMetadataReader(resource); 

      if (typeFilter.match(metadataReader, metadataReaderFactory)) { 
       String className = metadataReader.getClassMetadata().getClassName(); 
       Class<?> annotatedClass = classLoader.loadClass(className); 

     // CHECK IF THE CLASS HAS PROPERLY ANNOTATED FIELDS AND 
     // DO SOMETHING WITH THE CLASS FOUND... E.G., PUT IT IN SOME REGISTRY 

      } 
     } catch (Exception e) { 
      throw new FindException("Failed to analyze annotation for resource: " + resource, e); 
     } 
    } 
} 
Смежные вопросы