Java.lang.reflect.Proxy从调用返回另一个代理导致分配时ClassCastException
-
27-09-2019 - |
题
所以我在玩geotools,我想我将代理他们的数据访问类之一,并跟踪它们在代码中的使用方式。
我编写了一个动态代理,并在其中包装了FeatureSource(接口),然后愉快地运行了。然后,我还想看一下FeatureSource返回的一些可传递对象,因为FeatureSource所做的主要工作是返回FeatureCollection(FeatureSource类似于sql DataSource,featurecollection类似于sql语句)。
在调用处理程序中,我只是将调用传递给了基础对象,并在执行过程中打印出了目标类/方法/ args和结果,但是对于返回FeatureCollection(另一个接口)的调用,我将该对象包装在了代理(同一个类,但有一个新实例,应该没关系吗?)并返回它。 AM!类广播例外: 通用标签
呼叫代码: 通用标签
代理: 通用标签
}
是否可以从代理接口动态返回接口的代理?还是我做错了? 欢呼!
解决方案
Class.getInterfaces()仅返回由类直接实现的接口。您需要一个传递闭包来获取所有接口。
更新
示例: 通用标签
您可能还需要“解开”作为参数传递的代理。
其他提示
@ maurice-perry的解决方案对我来说非常有效,我对此表示赞成,但我也确实想指出,有所需方法的库实现。
我最终使用Apache Commons库方法通用标记代码: 通用标签
它对于 ClassUtils.getAllInterfaces()
:
通用标签
还有一种番石榴方法,使用: 通用标签
但是随后您必须弄清楚如何将newProxyInstance
转换为Set<TypeToken>
。如果您是Guava爱好者,那么也许微不足道,但是Apache可以使用了。
这两个相关线程中均提到了这两种情况,全部获取(派生)类的接口。