Аннотация Java возвращает загадочные имена классов

StackOverflow https://stackoverflow.com/questions/1363424

  •  20-09-2019
  •  | 
  •  

Вопрос

Я новичок в 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.

Это было полезно?

Решение

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

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());
}

Другие советы

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

Если вас это интересует, прочитайте java.lang.reflect.InvocationHandler и его подтип AnnotationInvoctionHandler.

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

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

@Retention(RetentionPolicy.RUNTIME)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top