Найти загруженный класс с определенной аннотацией - PullRequest
3 голосов
/ 18 мая 2011

Я пишу пользовательский метод кроссплатформенной сериализации, который поддерживает пользовательские типы (стандартные типы - строки, числа, карты, списки и т. Д.), Аннотируя класс следующим образом:

@CompactTypeName("myapp.BetweenFilter")
public static class BetweenFilter implements NumericFilter {

    static {
        CompactSerializer.registerClass(BetweenFilter.class);
    }

    ...

    @SuppressWarnings("unused")
    @Deserialize
    private static BetweenFilter compactRead(DataInputStream ins) throws IOException {
        return new BetweenFilter(ins.readInt(), ins.readInt());
    }

    @SuppressWarnings("unused")
    @Serialize
    private void compactWrite(DataOutputStream ous) throws IOException {
        ous.writeInt(from);
        ous.writeInt(to);
    }

}

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

Чтобы решить эту проблему, вместо регистрации класса с помощью CompactSerializer, сериализатор должен каким-то образом найти класс и связать его с данным именем типа ( "myapp.BetweenFilter" ) .

Как я могу это сделать? Я знаю, что это возможно, поскольку Spring-MVC, например, может автоматически находить классы с @Controller.

Ответы [ 2 ]

3 голосов
/ 18 мая 2011

Вам нужно отсканировать путь к классам. В основном: вам придется

  • найти каждый элемент classpath (папку или Jar)
  • Пройдите через каждый элемент, чтобы найти все элементы с именем * .class (путем обхода либо файловой системы, либо записей jar)
  • загрузка классов
  • проверить их на наличие аннотаций (если вы ищете аннотации методов, просканируйте все методы всех классов на вашем пути к классам)

Spring имеет узкоспециализированные классы, чтобы делать все это. Вы можете написать эту функциональность с нуля, но это огромная боль.

2 голосов
/ 18 мая 2011

Дополнительная информация о процессорах аннотаций в Java 6.

...