当前位置: 首页 > 知识库问答 >
问题:

如何确定Java类是否实现特定的接口[重复]

淳于健
2023-03-14

我试图使用反射来确定传入类是否实现了IsWdidget接口:

public boolean isAWidget(Class<?> clzz) {
    Class<?> runtimeClass = ClassLoader.getSystemClassLoader().loadClass(clzz.getName());
    Class<?>[] impls = runtimeClass.getInterfaces();
    for(Class<?> clz : impls)
        if(clz.getName().equals(IsWidget.class.getName()))
            return true;

    return false;
}

这是确定这一点的最佳/最有效的方法吗?我还看到一个IsWidget。班isAssignableFrom(类


共有3个答案

咸琪
2023-03-14

如果有对象,可以使用getInterfaces()方法。

    Class c[] = clzz.getInterfaces();   
    if(Arrays.asList(c).contains(IsWidget.class))
    {
        return true;
    }

getInterface方法为您提供一个Class数组,表示接口。或者也可以使用isAsSignablefrom方法,如下所示:

IsWidget.class.isAssignableFrom(clzz);

如果您有一个Object,您可以使用instanceof方法。

巫马翰翮
2023-03-14

1) 这毫无意义

  Class<?> runtimeClass = ClassLoader.getSystemClassLoader().loadClass(clzz.getName());

任何课程都可以试试这个

    Class<?> runtimeClass = ClassLoader.getSystemClassLoader().loadClass(clzz.getName());
    System.out.println(runtimeClass == clzz);

你会得到

true

因此,如果您删除这一行并直接使用clzz,它已经更高效了

2) 试试这个

class X extends Thread {
}

public static void main(String[] args) throws ClassNotFoundException {
    System.out.print(Arrays.toString(X.class.getInterfaces()));
}

你会得到

[]

这与func所做的类似,但实际上X实现了Runnable

3) 这是检查类是否实现了接口的非常有效的一行解决方案

    System.out.print(Runnable.class.isAssignableFrom(X.class));

输出

true
云焱
2023-03-14

我将使用isAssignableFrom方法来确定IsWidget是否为超级接口:

return IsWidget.class.isAssignableFrom(clzz);

引用上面链接的Javadoc:

确定此Class对象所表示的类或接口是否与指定的Class参数所表示的类或接口相同,或者是其超类或超接口。

 类似资料:
  • 问题内容: 我有一个对象。我想确定对象表示的类型是否实现特定的接口。我想知道如何实现? 我有以下代码。基本上,它所做的是获取指定包中所有类的数组。然后,我想遍历数组并将添加实现接口的Class对象添加到我的地图。问题是将一个对象作为参数。我无法实例化接口。所以我对此感到茫然。有任何想法吗? 问题答案: 您应该使用:

  • 我有一个对象。我想确定对象表示的类型是否实现了特定的接口。我想知道这是如何实现的? 我有以下代码。基本上,它所做的是获取指定包中所有类的数组。然后,我想遍历数组并将实现接口的类对象添加到映射中。问题在于将对象作为参数。我无法实例化接口。所以我有点不知所措。有什么想法吗?

  • 好了, 我有一个标记接口: 然后我有一个类实现这个接口: 现在假设我有一个持有类MePOJO的引用: 那么,我如何通过使用来确定类是否实现了?

  • 问题内容: 我是Java泛型的新手,来自.NET世界,我习惯于编写这样的方法: 该方法接受通用类型的对象,并检查该对象是否实现通用接口的 特定 版本,在这种情况下为。 现在,在Java中,我可以执行以下操作: 但 Java并 没有 让我做 据我所知,由于类型擦除,通常在Java中,此类将由类对象处理,我们将执行以下操作: 但是由于我要检查的类型是通用接口,所以您不能这样做: 那么,如何在Java中

  • 众所周知,Java8已经向Java开发人员介绍了函数式编程。 诸如比较器、可运行、可调用等接口都是功能性的。 定义如下:函数接口是只有一个抽象方法的接口。 但例如,同一接口的比较器有多个抽象方法: 那么,对于如何确定接口是否具有功能性,以便将其用作lambda表达式或方法引用的赋值目标,是否有任何严格的规则?

  • 问题内容: 我正在开发一个应用程序(Quartz调度程序),其中有一个作业类负责实际执行工作,我们需要在Quartz调度程序中创建触发器时告知/传递作业类的名称。 我想为所有想使用该API的人提供一个扩展点(除了我将作为API的一部分提供的一些通用作业之外)。这个想法是创建一个(标记)接口,如果有人想将其类声明为调度程序作业类,那么他们要做的就是(声明)实现该接口。 我不确定如何找到合约之后的类(