Java определяет, является ли класс прокси - PullRequest
10 голосов
/ 21 сентября 2011

Можно ли определить, является ли класс прокси ( динамический , 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 прокси.

Ответы [ 3 ]

10 голосов
/ 21 сентября 2011
1 голос
/ 21 сентября 2011

Если instanceof приемлемо, то clazz.isInstance(b) также должно работать.

Edit:
Я написал это, прежде чем читать ваш измененный ответ. Аналогичный метод существует и для классов:

b.isAssignableFrom(a)

0 голосов
/ 24 мая 2013

нет, в общем случае вы не можете определить, является ли объект прокси-сервером. и это просто потому, что трудно определить, что такое прокси. Вы можете реализовать интерфейс и использовать его как прокси, вы можете использовать cglib, asm, javassist, plastic, jdk или генерировать байт-код на лету самостоятельно это ничем не отличается от загрузки файла xxx.class.

Вы, вероятно, думаете о том, чтобы проверить, создан ли объект cglib, asm или другой определенной библиотекой. в таком случае - обычно да. большинство библиотек имеют свои собственные отпечатки пальцев, которые можно обнаружить. но в целом это невозможно

...