我有一个Class
对象。我想确定Class
对象表示的类型是否实现了特定的接口。我想知道这是如何实现的?
我有以下代码。基本上,它所做的是获取指定包中所有类的数组。然后,我想遍历数组并将实现接口的Class对象添加到Map中。问题是isInstance()
接受一个对象作为参数。我无法示例化接口。所以我有点不知所措。有什么想法吗
Class[] classes = ClassUtils.getClasses(handlersPackage);
for(Class clazz : classes)
{
if(clazz.isInstance(/*Some object*/)) //Need something in this if statement
{
retVal.put(clazz.getSimpleName(), clazz);
}
}
5条答案
按热度按时间jjjwad0x1#
使用
isAssignableFrom
:bd1hkmkf2#
你可以使用下面的函数来获取所有实现的接口
nhaq1z213#
您可以使用
class.getInterfaces()
,然后检查接口类是否在其中。dldeef674#
也可以设置示例添加“.class”
zysjyyx45#
所有其他答案的贡献,尽可能不要使用
isAssignableFrom
方法的the most upvoted answer,即使使用clazz.getInterfaces()
的“不太好”答案也比isAssignableFrom
性能更好。开发人员在寻找OP问题的答案时常见的一个错误是,当示例可用时,首选
isAssignableFrom
,错误地这样做:如果可能的话,使用
IMyInterface.class.isInstance
或instanceof
,因为这两种都有更好的性能。当然,正如OP所述;它们的缺点是你必须有一个示例,而不仅仅是class
。一个更快,但丑陋的解决方案是存储一个静态
Set
与所有“有效”的类,而不是检查它们,**这个丑陋的解决方案是唯一的首选,当你需要测试类很多,**因为它的性能优于所有其他方法直接class
检查。(*)JMH基准+0.2%
请访问this answer从用户@JBE,@Yura和@aleksandr-dubinsky,学分为他们。另外,在这个答案中有很多细节说明基准测试结果是无效的,所以请仔细研究一下。