Я пытаюсь создать прокси для данного объекта Runnable, используя следующий код:
public class WorkInvocationHandler implements InvocationHandler {
public static Runnable newProxyInstance(Runnable work)
{
return (Runnable)java.lang.reflect.Proxy.newProxyInstance(
work.getClass().getClassLoader(),
getInterfacesWithMarker(work),
new WorkInvocationHandler(work));
}
private static Class[] getInterfacesWithMarker(Runnable work)
{
List allInterfaces = new ArrayList();
// add direct interfaces
allInterfaces.addAll(Arrays.asList(work.getClass().getInterfaces()));
// add interfaces of super classes
Class superClass = work.getClass().getSuperclass();
while (!superClass.equals(Object.class))
{
allInterfaces.addAll(Arrays.asList(superClass.getInterfaces()));
superClass = superClass.getClass().getSuperclass();
}
// add marker interface
allInterfaces.add(IWorkProxy.class);
return (Class [])allInterfaces.toArray(new Class[allInterfaces.size()]);
}
}
Прокси должен реализовывать все интерфейсы, которые данный объект реализует с дополнительным интерфейсом маркера, который указывает, является липрокси уже создан.Поскольку я не знаю точно, что данный объект реализует Runnable напрямую, я пересекаю также все суперклассы, однако я предполагаю, что если он реализует другой интерфейс, который реализует Runnable, он будет работать, поэтому мне не нужно проходить также по иерархии интерфейсов..
Тем не менее, я все равно получаю ClassCastException
при попытке привести прокси к Runnable
:
java.lang.ClassCastException: $Proxy24 incompatible with java.lang.Runnable
Я пытаюсь понять, что могло вызвать это исключение.Иерархия классов данного объекта недоступна.
Есть идеи?