Рубрики
Без рубрики

Проверка того, является ли класс Java “абстрактным” с помощью отражения

Узнайте, как проверить, является ли класс Java абстрактным, используя API отражения.

Автор оригинала: baeldung.

1. Обзор

В этом кратком руководстве мы обсудим, как мы можем проверить, является ли класс абстрактным или нет в Java, используя API Reflection .

2. Пример класса и интерфейса

Чтобы продемонстрировать это, мы создадим Абстрактный пример класса и Пример интерфейса интерфейса:

public abstract class AbstractExample {

    public abstract LocalDate getLocalDate();

    public abstract LocalTime getLocalTime();
}

public interface InterfaceExample {
}

3. Метод Модификатора#isAbstract

Мы можем проверить, является ли класс абстрактным или нет, используя Модификатор#isAbstract метод из API отражения:

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

В приведенном выше примере мы сначала получаем экземпляр класса, который мы хотим протестировать. Как только у нас есть ссылка на класс, мы можем вызвать Модификатор#isAbstract метод . Как и следовало ожидать, он возвращает true , если класс является абстрактным , а в противном случае он возвращает false .

Стоит отметить, что интерфейс класс абстрактный также . Мы можем проверить это методом тестирования:

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

Если мы выполним описанный выше метод тестирования, он пройдет.

API отражения также предоставляет метод isInterface () . Если мы хотим проверить , является ли данный класс абстрактным , но не является интерфейсом , мы можем объединить эти два метода:

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

Давайте также проверим, что конкретный класс возвращает соответствующие результаты:

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

4. Заключение

В этом уроке мы видели, как мы можем проверить, является ли класс абстрактным или нет.

Кроме того, мы рассмотрели, как проверить, является ли класс абстрактным классом, но не интерфейсом на примере.

Как всегда, полный код для этого примера доступен на GitHub .