gpt4 book ai didi

java - 尝试创建代理对象时出现 ClassCastException

转载 作者:行者123 更新时间:2023-12-04 06:29:26 28 4
gpt4 key购买 nike

我正在尝试使用以下代码为给定的 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()]);
}
}

代理应实现给定对象实现的所有接口(interface),并带有指示代理是否已创建的附加标记接口(interface)。
由于我不确定给定对象是否直接实现 Runnable 我也在所有父类(super class)上遍历,但是我假设如果它实现另一个实现 Runnable 的接口(interface)它将工作,所以我不需要遍历接口(interface)层次结构.

但是,我仍然得到 ClassCastException尝试将代理转换为 Runnable 时:
java.lang.ClassCastException: $Proxy24 incompatible with java.lang.Runnable

我正在尝试思考可能导致此异常的原因。给定对象的类层次结构不可用。

有任何想法吗 ?

最佳答案

更新 删除了无用的代码。

这不是问题,但您应该使用 Set<Class<?>>当您收集所有接口(interface)时,因为您可以在层次结构中获得相同接口(interface)的重复项。

关于java - 尝试创建代理对象时出现 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5622201/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com