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 上找到。