Java - 如何检查一个类是否继承自某个类或接口?

18

我需要检查:

public static boolean check(Class<?> c, Class<?> d)
{
    if (/* c inherits from d */)
        return true;
    else
        return false;
}

我该怎么做?

而且这是否可以在不使用 c.newInstance() 的情况下实现?


标题一开始是错误的。现在已经更正。

6个回答

36
使用 isAssignableFrom
if(d.isAssignableFrom(c)){
    // then d is a superclass of c
    // in other words, c inherits d
}

确定由该Class对象表示的类或接口是否与指定的Class参数表示的类或接口相同,或者是其超类或超接口。如果是,则返回true;否则返回false。如果该Class对象表示原始类型,则如果指定的Class参数恰好是该Class对象,则此方法返回true;否则返回false。

来源


3

Class类中,有一个被称为Class#isInterface()的方法。

该方法可以用来判断一个类是否为接口。
 if (c.isInterface())
            return true;

2
我没有进行负面评价,但是当我看到这个答案时,我的第一个想法是它如何检查继承或实现特定接口。也许问题在你阅读时有所改变,但如果你重新阅读一下,原始发布者是想要发现一个类是否扩展了另一个类或者实现了一个特定的接口。注意 c inherits d 的注释? - Kevin Bowersox
1
@KevinBowersox 最初的问题标题不同。 :) - PermGenError
1
这正是我所怀疑的,你通常都能给出好的答案。 - Kevin Bowersox
1
如果问题在回答发布后被更改,那么对其进行负面评价是不公平的! - Apurv
1
@Apurv 其实,这不是关于投反对票的问题,只是反对者应该在评论中说明原因。 :) - PermGenError
@PermGenError 我猜有时候人们在评估答案时太匆忙了! - Apurv

2

试一试这个

if(c.isAssignableFrom(d)){
   return true;
} else {
   return false;
}

1
提示正确,但是c和d必须交换 d.isAssignableFrom(c) - Bitterblue
1
写成 return c.isAssignableFrom(d) 不是更合理吗?或者你是个过于啰嗦的人。 - Derrops

1
if (c.isInterface()) return true;

isInterface(是接口)
public boolean isInterface()

确定指定的Class对象是否表示接口类型。 返回值: 如果此对象表示接口,则为true;否则为false。 sAssignableFrom

public boolean isAssignableFrom(Class<?> cls)

确定由此Class对象表示的类或接口是否与指定的Class参数表示的类或接口相同,或者是超类或超接口。如果是,则返回true;否则返回false。 如果此Class对象表示原始类型,则如果指定的Class参数恰好为此Class对象,则此方法返回true;否则返回false。
具体来说,此方法测试指定的Class参数所表示的类型是否可以通过标识转换或通过扩展引用转换转换为此Class对象所表示的类型。 有关详细信息,请参见Java语言规范的第5.1.1节和5.1.4节。
参数: cls - 要检查的Class对象 返回值: 布尔值,指示是否可以将cls类型的对象分配给此类的对象 抛出: NullPointerException-如果指定的Class参数为null。 自: JDK1.1

1

如何使用

public boolean isInterface();

根据文档:

确定指定的Class对象是否表示接口类型。 返回值: 如果该对象表示接口,则为true;否则为false。


0

你尝试过使用

c.isInterface()???

来自文档

确定指定的 Class 对象是否表示接口类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接