Java-аннотация возвращает загадочные имена классов - PullRequest
16 голосов
/ 01 сентября 2009

Я немного новичок в Java, поэтому, возможно, я неправильно понимаю варианты использования аннотаций в Java. Моя проблема заключается в следующем:

После аннотирования метода я получаю имена классов, такие как $ Proxy31, при проверке аннотаций метода. Мне любопытно, почему я получаю имена классов для моих аннотаций, которые похожи на это, и что я могу сделать, чтобы решить эту проблему.

Method m = this.remoteServiceClass.getMethod(rpcRequest.getMethod().getName());
RequiredPermission a = m.getAnnotation(RequiredPermission.class);

Это возвращает нулевую аннотацию, даже если я знаю, что в методе, который он ищет, реализована аннотация RequiredPermission.

for(Annotation a : m.getAnnotations())
{
    System.out.println(a.getClass().getName());
}

Это распечатывает имена классов $ Proxy31.

Ответы [ 3 ]

24 голосов
/ 01 сентября 2009

Учитывая Annotation a, вам нужно вызвать annotationType (), а не getClass (), чтобы определить тип аннотации. Объект Annotation - это просто прокси, который представляет этот экземпляр аннотации для этого класса.

Object o = ...;
Class c = o.getClass();
Annotation[] as = c.getAnnotations();
for (Annotation a : as) {
   // prints out the proxy class name
   System.out.println(a.getClass().getName());
   // prints out the name of the actual annotation
   System.out.println(a.annotationType().getName());
}
1 голос
/ 01 сентября 2009

также .. не забудьте установить это:

@Retention(RetentionPolicy.RUNTIME)

в вашей аннотации, чтобы она оставалась за пределами компиляции.

1 голос
/ 01 сентября 2009

Когда вы добавляете аннотации в исходный код, Java фактически создает группу интерфейсов и классов, которые позволяют вам (или вашим инструментам) задавать программе вопросы об аннотациях с использованием ограничений. Аннотации методов создают «dyanmic прокси», и, соответственно, Java создает классы для вас, вероятно, с именем Proxy.

Если вы заинтересованы в этом, прочитайте java.lang.reflect.InvocationHandler и его подтип AnnotationInvocationHandler

При этом вам не нужно беспокоиться о том, что на самом деле генерирует Java. Я подозреваю, что вы не используете отражение правильно для проверки своих аннотаций из Java-программы.

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