У меня проблема при чтении аннотаций для методов прокси-класса.
В нем есть интерфейс, объект и аннотация, эта часть действительно проста:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@interface A {
}
interface I {
void method();
}
class Test implements I {
@A
public void method() { }
}
Далее, есть InvocationHandler
, который ничего не делает, просто вызывает метод с переданными аргументами:
class DefaultInvocationHandler implements InvocationHandler {
@Override
public Object invoke(final Object o, final Method method, final Object[] args) throws Throwable {
return method.invoke(o, args);
}
}
И есть метод main
, который печатает объявленные методы Test
Экземпляр и его прокси-аналог:
class Main {
public static void main(String[] args) {
Object test = new Test();
printMethods(test); // Outputs that `I#method` has `A` annotation
System.out.println();
Object proxied = Proxy.newProxyInstance(test.getClass().getClassLoader(), test.getClass().getInterfaces(), new DefaultInvocationHandler());
printMethods(proxied); // Outputs that `I#method` does not have `A` annotation
}
static void printMethods(Object obj) {
Arrays.stream(obj.getClass().getDeclaredMethods())
.forEach(method -> System.out.println(method.toString() + " has A annotation: " + method.isAnnotationPresent(A.class)));
}
}
И здесь возникает проблема: локальная переменная test
имеет экземпляр класса Test
, а локальная переменная proxied
на самом деле Proxy
, поэтомуу него нет никаких аннотаций на его методы. Вот вывод программы:
public void Test.method() has A annotation: true // <- good thing
public final boolean $Proxy2.equals(java.lang.Object) has A annotation: false
public final java.lang.String $Proxy2.toString() has A annotation: false
public final void $Proxy2.method() has A annotation: false // <- bad thing
public final int $Proxy2.hashCode() has A annotation: false
Я пытался найти решение, но этот вопрос касается извлечения аннотаций из аннотации (я полагаю), этоодин слишком о классе аннотации. Некоторые из них касаются других реализаций прокси.
➥ Итак, есть ли способ получить реальные аннотации от прокси-объекта или открыть класс, который скрыт под прокси (хотя хочешь прежний)?