Попытка создать прокси для типа без аннотации - PullRequest
0 голосов
/ 05 февраля 2019

Почему я получаю java.lang.annotation.AnnotationFormatError: Attempt to create proxy for a non-annotation type., когда пытаюсь получить список аннотаций из поля?

Моя аннотация:

@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
private @interface TypicalAnnotation
{
    int size();
}

Использование:

public static class MockAnnotatedClass
{
    @TypicalAnnotation(size = 3)
    public Integer number = 2;
}

Звоните:

ReflectionUtils.getAllFields(clazz1).getAnnotations() <- got the exception.

1 Ответ

0 голосов
/ 06 августа 2019

У меня была такая же проблема, когда я использовал Jdeveloper 12.2.1.0.0 и интегрировал Weblogic с включенной функцией быстрой замены.

если вы посмотрите на исходный код ( github ), вы увидите, что выдается исключение, если тип не является аннотацией или реализует более одного интерфейса или не реализует JavaИнтерфейс аннотации:

Class<?> type = MyAnnotation.class;

System.out.println("type.isAnnotation() " + type.isAnnotation());
System.out.println("type.getInterfaces().length " + type.getInterfaces().length);

for (Class<?> superType : type.getInterfaces()) {
    System.out.println("type.getInterfaces()[i] " + superType);
}

Вывод:

type.isAnnotation() true
type.getInterfaces().length 2
type.getInterfaces()[i] interface java.lang.annotation.Annotation
type.getInterfaces()[i] interface com.bea.wls.redef.Redefinable     // << ??????

Как оказалось, к аннотации добавлен еще один интерфейс.Я не нашел информации конкретно о com.bea.wls.redef.Redefinable.После небольшого поиска я понял, что пакет com.bea.wls.redef используется функцией быстрой замены.

Я вижу 2 решения:

  1. ОтключитьФункция быстрой замены.

  2. Переместите все пользовательские аннотации в отдельную банку.Это то, что я сделал.

Возможно, есть способ отключить упаковку для комментариев.Но я не нашел его.

...