确定类是否在Java中实现接口

oymdgrw7  于 2023-06-04  发布在  Java
关注(0)|答案(5)|浏览(311)

我有一个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);
    }
}
jjjwad0x

jjjwad0x1#

使用isAssignableFrom

if (YourInterface.class.isAssignableFrom(clazz)) {
    ...
}
bd1hkmkf

bd1hkmkf2#

你可以使用下面的函数来获取所有实现的接口

Class[] intfs = clazz.getInterfaces();
nhaq1z21

nhaq1z213#

您可以使用class.getInterfaces(),然后检查接口类是否在其中。

Class someInterface; // the interface you want to check for 
Class x; // 
Class[] interfaces = x.getInterfaces();

for (Class i : interfaces) {
    if (i.toString().equals(someInterface.toString()) {
        // if this is true, the class implements the interface you're looking for
    }
}
dldeef67

dldeef674#

也可以设置示例添加“.class”

Class[] classes = ClassUtils.getClasses(handlersPackage);
for(Class clazz : classes)
{
    if(Interface.class.isAssignableFrom(clazz))
    {
        retVal.put(clazz.getSimpleName(), clazz);
    }
}
zysjyyx4

zysjyyx45#

所有其他答案的贡献,尽可能不要使用isAssignableFrom方法的the most upvoted answer,即使使用clazz.getInterfaces()的“不太好”答案也比isAssignableFrom性能更好。

开发人员在寻找OP问题的答案时常见的一个错误是,当示例可用时,首选isAssignableFrom错误地这样做

if (IMyInterface.isAssignableFrom(myObject.getClass())) {
    ...

如果可能的话,使用IMyInterface.class.isInstanceinstanceof,因为这两种都有更好的性能。当然,正如OP所述;它们的缺点是你必须有一个示例,而不仅仅是class

if (IMyInterface.class.isInstance(myObject)) {
    ...
if (myObject instanceof IMyInterface) { // +0.2% slower than `isInstance` (*see benchmark)
    ...

一个更快,但丑陋的解决方案是存储一个静态Set与所有“有效”的类,而不是检查它们,**这个丑陋的解决方案是唯一的首选,当你需要测试类很多,**因为它的性能优于所有其他方法直接class检查。

public static final Set<Class<?>> UGLY_SET = Stream.of(MyClass1.class, MyClass2.class, MyClass3.class).collect(Collectors.toCollection(HashSet::new));
if (UGLY_SET.contains(MyClass)) {
    ...
(*)JMH基准+0.2%

请访问this answer从用户@JBE,@Yura和@aleksandr-dubinsky,学分为他们。另外,在这个答案中有很多细节说明基准测试结果是无效的,所以请仔细研究一下。

相关问题