Методы получения метаданных аннотации в Java - PullRequest
3 голосов
/ 08 декабря 2011

Я работаю над платформой проверки JSR-303 для GWT.Некоторые из вас, возможно, слышали об этом, хотя это небольшой проект. Вот gwt-validation.

В старые времена (v1.0) он использовал интерфейс маркера для каждого класса, и каждый класс имел метаданные, генерируемые отдельно.Это было плохо, потому что это не было частью стандарта JSR-303, и мы перешли к следующей идее.

В версии 2.0 он сканирует путь к классам во время выполнения, используя Reflections .Это замечательно.Недостатком является то, что он не может работать внутри контейнерных сред или сред с особыми ограничениями.

Возможно, это моя ошибка, посмотрите на следующий код:

    //this little snippet goes through the classpath urls and ommits jars that are on the forbidden list.
    //this is intended to remove jars from the classpath that we know are not ones that will contain patterns
    Set<URL> classPathUrls = ClasspathHelper.forJavaClassPath();
    Set<URL> useableUrls = new HashSet<URL>();
    for(URL url : classPathUrls) {
        boolean use = true;
        for(String jar : this.doNotScanJarsInThisList) {
            if(url.toString().contains(jar)) {
                use = false;
                break;
            }
        }
        if(use) {
            useableUrls.add(url);
        }
        use = false;
    }       

    ConfigurationBuilder builder = new ConfigurationBuilder()
                                    .setUrls(useableUrls)
                                    .setScanners(   new TypeAnnotationsScanner(), 
                                                    new FieldAnnotationsScanner(), 
                                                    new MethodAnnotationsScanner(), 
                                                    new SubTypesScanner()
                                    )
                                    .useParallelExecutor()
                                    ;

    this.reflections = new Reflections(builder);

Я использую фильтр для удаления банок, которые я знаю не может содержать в себе аннотации, которые меня интересуют. Как я уже упоминал, это дает огромный прирост скорости (особенно для больших путей к классам), ноClasspathHelper.forJavaClassPath (), на котором я это основываю, вероятно, не лучший способ перейти в контейнер средах.(например, Tomcat, JBoss)

Есть ли лучший способ или хотя бы способ, который будет работать с контейнерной средой и все же позволять моим пользователям отфильтровывать классы, которые им не нужны?

IНекоторые изучали, как проект проверки гибернации (эталонная реализация для JSR-303) и как они, по крайней мере, используют (хотя бы частично) обработку аннотаций в Java 6. Это не может быть всеистория, потому что она не появлялась, пока JDK6 и Hibernate Validator не совместимы с JDK5.(См .: документация по гибернации )

Итак, как всегда, есть еще история.

Я прочитал эти темы, для справки:

  • О Scannotation , который был в значительной степени заменен на Reflections.
  • Это one , но в нем используется File, и я не уверен, какие последствия это имеетчто в таких вещах, как GAE (Google App Engine) или Tomcat.
  • Еще одна , которая выходит за рамки , о многих вещах, о которых я уже говорил.

Эти потоки только очень помогли.

Я также прочитал об инфраструктуре обработки аннотаций , и я должен что-то упустить.Похоже, что он делает то, что я хочу, но, опять же, он работает только во время компиляции , что, как я знаю, не то, что делает Hibernate Validator.(Может кто-нибудь объяснить, как оно выполняет сканирование? Это работает на GAE, что означает, что не может использовать какой-либо из пакетов ввода-вывода.)

Кроме того, этот код будет работать лучше, чем у менявыше?

Set<URL> classPathUrls = ClasspathHelper.forClassLoader(Thread.currentThread().getContextClassLoader());

Может ли это правильно загрузить загрузчик классов внутри контейнера Tomcat или JBoss?Кажется, он сканирует меньший набор классов и все еще в порядке.

Так, в любом случае, кто-нибудь может помочь мне указать правильное направление?Или я просто застрял с тем, что у меня есть?

1 Ответ

0 голосов
/ 09 декабря 2011

Вы можете взглянуть на поддержку аннотаций Spring.Spring может сканировать аннотации в файлах (используя asm IIRC) и работать в контейнере и из контейнера.

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

...