问题 如何确定Java类是否实现特定接口


我正在尝试使用反射来确定传入的类是否实现了 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.class.isAssignableFrom(Class<?>) 方法...


2035
2018-05-03 17:03


起源



答案:


我会用的 isAssignableFrom 确定是否的方法 IsWidget 是一个超级接口:

return IsWidget.class.isAssignableFrom(clzz);

引用上面链接的Javadoc:

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


13
2018-05-03 17:07





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

1
2018-05-03 17:06





你可以使用 getInterfaces() 如果你有一个方法 Class 目的。

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

getInterfaces方法为您提供了一个数组 Class 代表 interfaces。或者您也可以使用isAssignableFrom方法,如下所示:

IsWidget.class.isAssignableFrom(clzz);

如果你有 Object 你可以使用 instanceof 方法。


1
2018-05-03 17:08



这将决定是否 clzz 是一个超类 IsWidget;它倒退了。 - rgettman
@rgettman:更正了。谢谢你的通知。:) - Rahul Bobhate


答案:


我会用的 isAssignableFrom 确定是否的方法 IsWidget 是一个超级接口:

return IsWidget.class.isAssignableFrom(clzz);

引用上面链接的Javadoc:

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


13
2018-05-03 17:07





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

1
2018-05-03 17:06





你可以使用 getInterfaces() 如果你有一个方法 Class 目的。

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

getInterfaces方法为您提供了一个数组 Class 代表 interfaces。或者您也可以使用isAssignableFrom方法,如下所示:

IsWidget.class.isAssignableFrom(clzz);

如果你有 Object 你可以使用 instanceof 方法。


1
2018-05-03 17:08



这将决定是否 clzz 是一个超类 IsWidget;它倒退了。 - rgettman
@rgettman:更正了。谢谢你的通知。:) - Rahul Bobhate


如果有效,那应该没问题。你也可以尝试拨打电话 cast 的方法 Class 上课并尝试抓住。


0
2018-05-03 17:07



这确实有效,但它确实滥用了使用try / catch块的意义。此外,抛出的异常将使调用更加昂贵(尽管我不确定使用反射确定实现接口会有多高效) - Bender the Greatest