2015-10-01 1 views
1

Я пытаюсь использовать Reflections API, но мне трудно вернуться к классам с помощью пользовательской аннотации.API отражения не возвращается Аннотированный класс

Я передаю список URL-адресов из каталога; переходя через код, он, кажется, находит класс, который имеет аннотацию.

URLClassLoader urlClassLoader = new URLClassLoader(plugins.toArray(new URL[plugins.size()]), null); 

      Reflections reflections = new Reflections(new ConfigurationBuilder() 
        .setUrls(ClasspathHelper.forClassLoader(urlClassLoader)) 
        .setScanners(
          new SubTypesScanner(false), 
          new TypeAnnotationsScanner())); 

Но последний фрагмент кода, в котором мне нужен класс, содержащий аннотацию, всегда возвращается и пуст. Я делаю что-то явно неправильно?

classes = reflections.getTypesAnnotatedWith(Column.class, true); 

Категория: Аннотации;

@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Column { 
    boolean load() default false; 
    Class loaderClass(); 
    Class criteriaClass(); 
    String indicator(); 
    String columnName(); 
} 

Кажется, что точка отказа от меня на самом деле;

return Sets.newHashSet(concat(forNames(annotated, loaders()), forNames(classes, loaders()))); 

Метод погрузчиков возвращает null. И аннотированные, и классы Iterables заполнены.

+0

Откуда взята колонковая аннотация? Если он написан вами, вы можете показать его код? – rsutormin

+0

Удостоверьтесь, что аннотация столбца имеет политику хранения во время выполнения: http://stackoverflow.com/questions/3107970/how-do-different-retention-policies-affect-my-annotations – rsutormin

+0

Я добавил код примечания Column.class. – cbm64

ответ

0

Ok, так что похоже, что я был немного упрощенно ...

Поддиректория я проходил в необходимости быть добавлены к ClassLoader с помощью URLClassLoader.

URLClassLoader childURLClassLoader = new URLClassLoader(plugins.toArray(new URL[plugins.size()]), classLoader); 

Как только я это сделал, а затем изменил ConfigurationBuilder;

Reflections reflections = new Reflections(new ConfigurationBuilder() 
        .setScanners(new SubTypesScanner(false), new TypeAnnotationsScanner()) 
        .setUrls(ClasspathHelper.forClassLoader(childURLClassLoader)).addClassLoader(childURLClassLoader)); 

Все было хорошо.

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