Как я получаю базовый тип объекта прокси в Java?

Я хотел бы получить доступ к имени класса базового класса, который является экземпляром java.lang.reflect.Proxy.

Действительно ли это возможно?

28
задан Andrew Tobilko 28 July 2017 в 11:30
поделиться

2 ответа

Вы можете получить InvocationHandler , с помощью которого был создан прокси, вызвав Proxy.getInvocationHandler (proxy)

Обратите внимание, что в случае java.lang.reflect.Proxy не существует базового класса как такового. Прокси-сервер определяется:

  • интерфейсом (ами)
  • обработчиком вызова

И обернутый класс обычно передается конкретному обработчику вызова.

24
ответ дан 28 November 2019 в 02:45
поделиться

Ну, экземпляр Proxy не будет экземпляром java.lang.reflect.Proxy как таковой . Скорее, это будет экземпляр подкласса из java.lang.reflect.Proxy .

В любом случае, способ получить фактическое имя прокси-классов:

Proxy proxy = ...
System.err.println("Proxy class name is " + proxy.getClass().getCanonicalName());

Однако вы не можете получить имя класса, для которого прокси является прокси-сервером, потому что:

  1. вы прокси-интерфейсы, а не классы, и
  2. Прокси может быть прокси для нескольких интерфейсов

Однако, глядя на исходный код класса ProxyGenerator , кажется, что интерфейсы записаны в сгенерированном классе прокси как интерфейсы класс. Таким образом, вы должны иметь возможность получать их во время выполнения через объект прокси-классов Class ; например

Class<?>[] classes = proxy.getClass().getInterfaces();

(Примечание: я не пробовал это ...)

15
ответ дан 28 November 2019 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: