Почему isAnnotationPresent (Id.class) не работает для файла класса - PullRequest
5 голосов
/ 23 марта 2012

У меня есть файл класса test.class.В этом файле есть аннотации @Id и @Entity.Но когда я проверяю аннотацию с помощью метода field.isAnnotationPresent(Id.class), он возвращает false.Я получаю все поля в переменной поля.

Может ли кто-нибудь сказать мне, какую ошибку я сделал.

update: я использую следующий код для получения класса

File file=new File("D:/test/");
URL url=file.toURL();
URL[] urls=new URL[]{url};
ClassLoader loader=new URLClassLoader(urls);
Class cls=loader.loadClass("com.net.test.Test");

Ответы [ 4 ]

29 голосов
/ 23 марта 2012

Аннотировали ли вы свою аннотацию политикой хранения?Если политика хранения не установлена, поведение политики хранения по умолчанию заключается в том, что аннотация читается компилятором и также сохраняется в сгенерированных файлах .class, но не будет доступна во время выполнения.Если вам нужна аннотация во время выполнения, вам нужно аннотировать свои аннотации с помощью:

@Retention(RetentionPolicy.RUNTIME)  
2 голосов
/ 24 марта 2012

Загрузчик классов вашего теста может иметь значение Id, отличное от loader.

Быстрый способ проверки:

...
Class idType = loader.loadClass("my.package.Id");
...
field.isAnnotationPresent(idType);

Если это работает, то у вас есть проблема с загрузчиком классов - точнее, ваш loader не использует загрузчик вашего тестового примера. Чтобы исправить, используйте другой конструктор:

ClassLoader loader = new URLClassLoader(urls, this.getClass().getClassLoader());
2 голосов
/ 23 марта 2012

Работает в общем. Вот рабочий пример:

import java.lang.reflect.Field;

public class AnnotationTest {

    @Deprecated
    public static int value = 1;

    public static void main(String[] args) throws Exception {
        Field field = AnnotationTest.class.getField("value");
        System.out.println(field.isAnnotationPresent(Deprecated.class));
    }
}

Дважды проверьте ваши имена классов и импорт. Может быть, вы случайно проверили на неправильность Id.class (nameclash).

0 голосов
/ 13 декабря 2013

Если вы используете isAnnotationPresent () в перехватчике Spring AOP и proxyTargetClass = false, добавьте аннотацию на целевой интерфейс вместо класса реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...