1. 概述

在这篇简短的教程中,我们将探讨如何使用 Java 的 反射(Reflection) API 来判断一个类是否是 抽象类

2. 示例类与接口

为了演示,我们先定义一个抽象类 AbstractExample 和一个接口 InterfaceExample

public abstract class AbstractExample {

    public abstract LocalDate getLocalDate();

    public abstract LocalTime getLocalTime();
}

public interface InterfaceExample {
}

3. 使用 Modifier#isAbstract 方法

Java 反射 API 提供了 Modifier#isAbstract 方法,可以用来判断某个类是否是抽象类:

@Test
void givenAbstractClass_whenCheckModifierIsAbstract_thenTrue() throws Exception {
    Class<AbstractExample> clazz = AbstractExample.class;
 
    Assertions.assertTrue(Modifier.isAbstract(clazz.getModifiers()));
}

✅ 上述代码中,我们首先获取目标类的 Class 对象,然后调用 Modifier.isAbstract() 方法传入类的修饰符。如果类是抽象的,该方法会返回 true,否则返回 false

⚠️ 值得注意的是:接口本身也被视为抽象类。我们可以通过以下测试验证这一点:

@Test
void givenInterface_whenCheckModifierIsAbstract_thenTrue() {
    Class<InterfaceExample> clazz = InterfaceExample.class;
 
    Assertions.assertTrue(Modifier.isAbstract(clazz.getModifiers()));
}

✅ 执行这个测试会通过,说明接口的修饰符也满足 isAbstract 的判断。

如果我们要判断的是“抽象类但不是接口”,可以结合 Modifier.isInterface() 方法一起使用:

@Test
void givenAbstractClass_whenCheckIsAbstractClass_thenTrue() {
    Class<AbstractExample> clazz = AbstractExample.class;
    int mod = clazz.getModifiers();
 
    Assertions.assertTrue(Modifier.isAbstract(mod) && !Modifier.isInterface(mod));
}

同样地,我们可以验证一个具体类(非抽象类)的情况:

@Test
void givenConcreteClass_whenCheckIsAbstractClass_thenFalse() {
    Class<Date> clazz = Date.class;
    int mod = clazz.getModifiers();
 
    Assertions.assertFalse(Modifier.isAbstract(mod) && !Modifier.isInterface(mod));
}

4. 总结

在这篇文章中,我们学习了如何使用反射判断一个类是否为抽象类。

同时,我们还介绍了如何进一步判断一个类是否是“抽象类但不是接口”,这在实际开发中可能会派上用场,比如在框架中做类型筛选时。

一如既往,完整的示例代码可以在 GitHub 上找到。


原始标题:Checking if a Java Class Is ‘Abstract’ Using Reflection