1. 概要

このクイックチュートリアルでは、 Reflection APIを使用して、クラスがabstractであるかどうかをJavaで確認する方法について説明します。

2. クラスとインターフェースの例

これを示すために、AbstractExampleクラスとInterfaceExampleインターフェイスを作成します。

public abstract class AbstractExample {

    public abstract LocalDate getLocalDate();

    public abstract LocalTime getLocalTime();
}

public interface InterfaceExample {
}

3. Modifier#isAbstractメソッド

ReflectionAPIのModifier#isAbstract メソッドを使用して、クラスがabstractであるかどうかを確認できます。

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

上記の例では、最初にテストするクラスのインスタンスを取得します。 クラス参照を取得したら、Modifier#isAbstractメソッドを呼び出すことができます。 予想どおり、クラスが abstractの場合はtrueを返し、それ以外の場合はfalseを返します。

インターフェイスクラスも抽象的であることに言及する価値があります。 テスト方法で検証できます。

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

上記のテストメソッドを実行すると、合格します。

Reflection APIは、 isInterface()メソッドも提供します。 特定のクラスがabstractであるが、 interface ではないかどうかを確認したい場合は、次の2つのメソッドを組み合わせることができます。

@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. 結論

このチュートリアルでは、クラスがabstractであるかどうかを確認する方法を見てきました。

さらに、例を通じて、クラスが abstract クラスであるが、interfaceではないかどうかを確認する方法について説明しました。

いつものように、この例の完全なコードは、GitHubから入手できます。