1. Overview
1.概述
In this quick tutorial, we’ll discuss how we can check if a class is abstract or not in Java by using the Reflection API.
在这个快速教程中,我们将讨论如何通过使用反射API,在Java中检查一个类是否是抽象的。
2. Example Class and Interface
2.示例类和接口
To demonstrate this, we’ll create an AbstractExample class and an InterfaceExample interface:
为了证明这一点,我们将创建一个AbstractExample类和一个InterfaceExample接口。
public abstract class AbstractExample {
public abstract LocalDate getLocalDate();
public abstract LocalTime getLocalTime();
}
public interface InterfaceExample {
}
3. The Modifier#isAbstract Method
3.Modifier#isAbstract方法
We can check if a class is abstract or not by using the Modifier#isAbstract method from the Reflection API:
我们可以通过使用Reflection API中的Modifier#isAbstract方法来检查一个类是否是抽象。
@Test
void givenAbstractClass_whenCheckModifierIsAbstract_thenTrue() throws Exception {
Class<AbstractExample> clazz = AbstractExample.class;
Assertions.assertTrue(Modifier.isAbstract(clazz.getModifiers()));
}
In the example above, we first obtain the instance of the class we want to test. Once we have the class reference, we can call the Modifier#isAbstract method. As we’d expect, it returns true if the class is abstract, and otherwise, it returns false.
在上面的例子中,我们首先获得我们要测试的类的实例。一旦我们有了类的引用,我们就可以调用 Modifier#isAbstract方法。正如我们所期望的,如果该类是抽象的,它将返回true,否则将返回false。
It’s worthwhile to mention that an interface class is abstract as well. We can verify it by a test method:
值得一提的是,一个接口类也是抽象的。我们可以通过一个测试方法来验证它。
@Test
void givenInterface_whenCheckModifierIsAbstract_thenTrue() {
Class<InterfaceExample> clazz = InterfaceExample.class;
Assertions.assertTrue(Modifier.isAbstract(clazz.getModifiers()));
}
If we execute the test method above, it’ll pass.
如果我们执行上面的测试方法,它就会通过。
The Reflection API provides an isInterface() method as well. If we want to check if a given class is abstract but not an interface, we can combine the two methods:
Reflection API也提供了一个isInterface()方法。如果我们想检查一个给定的类是否是抽象的,但不是接口,我们可以结合这两个方法。
@Test
void givenAbstractClass_whenCheckIsAbstractClass_thenTrue() {
Class<AbstractExample> clazz = AbstractExample.class;
int mod = clazz.getModifiers();
Assertions.assertTrue(Modifier.isAbstract(mod) && !Modifier.isInterface(mod));
}
Let’s also validate that a concrete class returns the appropriate results:
我们也来验证一下,一个具体的类是否会返回相应的结果。
@Test
void givenConcreteClass_whenCheckIsAbstractClass_thenFalse() {
Class<Date> clazz = Date.class;
int mod = clazz.getModifiers();
Assertions.assertFalse(Modifier.isAbstract(mod) && !Modifier.isInterface(mod));
}
4. Conclusion
4.总结
In this tutorial, we’ve seen how we can check if a class is abstract or not.
在本教程中,我们已经看到如何检查一个类是否是抽象的。
Further, we’ve addressed how to check if a class is an abstract class but not an interface through an example.
此外,我们通过一个例子解决了如何检查一个类是否是抽象类而不是接口。
As always, the complete code for this example is available over on GitHub.
一如既往,本例的完整代码可在GitHub上获得over。