Перейти к основному содержимому

Проверка того, является ли класс Java «абстрактным» с использованием отражения

· 2 мин. чтения

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

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

@Test
void givenAbstractClass_whenCheckModifierIsAbstract_thenTrue() throws Exception {
Class<AbstractExample> clazz = AbstractExample.class;

Assertions.assertTrue(Modifier.isAbstract(clazz.getModifiers()));
}

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

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

@Test
void givenInterface_whenCheckModifierIsAbstract_thenTrue() {
Class<InterfaceExample> clazz = InterfaceExample.class;

Assertions.assertTrue(Modifier.isAbstract(clazz.getModifiers()));
}

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

API Reflection также предоставляет метод 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 .