Вы расширяете Screen
, что означает, что это не interface
.
Динамические прокси работают, только если в иерархии присутствует база interface
.
interfaces.size() == 0
Таким образом, прокси не может реализовать никакой interface
, и, очевидно, он не является частью иерархии Screen
.
Если Screen
был interface
Ваш метод все еще слишком сложен.Этого
public static Screen getInstance(Class<? extends Screen> type)
достаточно.
Вы по-прежнему получаете исключение, потому что
Class#getInterfaces
возвращает interface
s, которые реализованы this class.
Это означает, что если вы вызовете его на EventDesignDialog.class
, он вернет пустой массив.
Это означает, что если вы вызовете его на EntityDesignDialog.class
, все равно он вернет пустоймассив.
Когда вы вызываете его на Screen.class
, он вернет
[IPage.class]
. Вам нужно зациклить иерархию с
Class#getSuperclass
, пока не найдете подходящий interface
.
Возможная реализация может выглядеть как
static Class<?>[] findInterfaces(final Class<?> type) {
Class<?> current = type;
do {
final Class<?>[] interfaces = current.getInterfaces();
if (interfaces.length != 0) {
return interfaces;
}
} while ((current = current.getSuperclass()) != Object.class);
throw new UnsupportedOperationException("The type does not implement any interface");
}
, что означает, что вам нужно изменить код на
return (IPage) Proxy.newProxyInstance(
type.getClassLoader(),
findInterfaces(type),
new IPageProxy(type)
);
Но, поскольку вы уже знаете, результат будетIPage
прокси, вы можете просто
return (IPage) Proxy.newProxyInstance(
type.getClassLoader(),
new Class[] { IPage.class },
new IPageProxy(type)
);
Здесь
public static IPage getInstance(final Class<? extends IPage> type)
вы возвращаете IPage
, но здесь
((EventDesignDialog)getInstance(EventDesignDialog.class))
вы пытаетесь понизить это, что означает, что вы пытаетесь привести его к более конкретному типу.Это невозможно, поскольку прокси не относится к типу EventDesignDialog
, но просто реализует ваш интерфейс IPage
.
Поскольку динамические прокси основаны на интерфейсе, вы будете вынуждены иметь делос интерфейсами.
Попытка привести к конкретным классам всегда вызовет исключение.
Если вам нужен IEventDesignDialog
, вам нужен новый прокси специально для него.