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 (динамический, cglib или другой).


С помощью @Jigar Joshi пока это выглядит так:

public boolean classEquals(Class a, Class b) {
    if (Proxy.isProxyClass(a)) {
        return classEquals(a.getSuperclass(), b);
    }
    return a.equals(b);
}

Проблема заключается в том, что он не обнаруживает, например, прокси CGLIB.


person Johan Sjöberg    schedule 21.09.2011    source источник
comment
Я предполагаю, что в вашем методе test Proxy(A.class) возвращает прокси-объект для A. Каким должен быть результат test(new A(), A.class)?   -  person Cephalopod    schedule 21.09.2011
comment
@Arian, это должно быть верно   -  person Johan Sjöberg    schedule 21.09.2011
comment
Итак, вы не хотите обнаруживать прокси, но хотите найти экземпляры класса, даже если они сгенерированы неизвестной структурой mocking/proxy? А как насчет instanceof?   -  person Cephalopod    schedule 21.09.2011
comment
@Ариан, хороший комментарий. Хотя я работаю с Classes, а не с Objects, что, к сожалению, не позволяет мне использовать instanceof   -  person Johan Sjöberg    schedule 21.09.2011
comment
CGLIB предоставляет Proxy.isProxyClass в своих собственных пакетах. Это может обнаружить их.   -  person A.H.    schedule 21.09.2011
comment
true, только если a.equals(b) и Proxy(a).equals(b) вы имели в виду «или»?   -  person Cephalopod    schedule 21.09.2011


Ответы (3)


Proxy.isProxyClass(Foo.class)

person jmj    schedule 21.09.2011
comment
Удивительно тем, что он обнаруживает DynamicProxy, но, похоже, не распознает созданные Mockito прокси-серверы CGLIB. - person Johan Sjöberg; 21.09.2011

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

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

b.isAssignableFrom(a)

person Cephalopod    schedule 21.09.2011
comment
Интересно, но, похоже, не подходит для сравнения классов. - person Johan Sjöberg; 21.09.2011

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

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

person piotrek    schedule 24.05.2013