我正在尝试使用以下代码为给定的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
我正在考虑可能导致此异常的原因。给定对象的类层次结构不可用。
有什么想法吗?
答案 0 :(得分:2)
更新删除了无用的代码。
这不是问题所在,但是当您收集所有接口时应该使用Set<Class<?>>
,因为您可以在层次结构中获得相同接口的副本。
答案 1 :(得分:1)
你走过超级课程的代码是错误的。取代
superClass = superClass.getClass().getSuperclass();
与
superClass = superClass.getSuperclass();
否则,您将快速绕道前往java.lang.Class
,然后转到java.lang.Object
。