Java определяет, является ли класс прокси-сервером
Можно ли определить, является ли класс прокси (динамическим, cglib или в противном случае)?
Пусть классы A
и B
реализуют общий интерфейс I
. Затем мне нужно определить подпрограмму classEquals
подписи
public boolean classEquals(Class<? extends I> a, Class<? extends I> b);
чтобы он оценивался как true только в том случае, если a.equals(b)
или Proxy(a).equals(b)
, где Proxy(a)
обозначает динамический прокси типа A
(dynamic, cglib или иначе).
При помощи @Jigar Joshi
это выглядит так:
public boolean classEquals(Class a, Class b) {
if (Proxy.isProxyClass(a)) {
return classEquals(a.getSuperclass(), b);
}
return a.equals(b);
}
Проблема заключается в том, что она не обнаруживает, например, прокси-сервер CGLIB.
Ответы
Ответ 2
Если instanceof
приемлемо, тогда clazz.isInstance(b)
должно работать.
Edit:
Я написал это, прежде чем читать ваш измененный ответ. Аналогичный метод существует и для классов:
Ответ 3
нет, в общем случае вы не можете определить, является ли объект прокси. и это просто потому, что трудно определить, что такое прокси. вы можете реализовать интерфейс и использовать его в качестве прокси-сервера, вы можете использовать cglib, asm, javassist, plastic, jdk или генерировать байт-код на лету самостоятельно. это ничем не отличается от загрузки файла xxx.class.
то, о чем вы думаете, вероятно, проверяет, создан ли объект cglib, asm или другой специальной библиотекой. в таком случае - обычно да. большинство библиотек имеют собственный отпечаток, который можно обнаружить. но в целом это невозможно