Аннотация Java возвращает загадочные имена классов
-
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)
в вашей аннотации, чтобы она жила за пределами компиляции.