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

Вызов статического метода с помощью Java Reflection API

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

1. Обзор

В этом кратком руководстве мы обсудим, как вызвать статический метод в Java с помощью API Reflection .

Мы рассмотрим два разных сценария:

  • Статический метод является общедоступным .
  • Статический метод является закрытым.

2. Пример класса

Чтобы упростить демонстрацию и объяснение, давайте сначала создадим класс GreetingAndBye в качестве примера:

public class GreetingAndBye {

public static String greeting(String name) {
return String.format("Hey %s, nice to meet you!", name);
}

private static String goodBye(String name) {
return String.format("Bye %s, see you next time.", name);
}
}

Класс GreetingAndBye выглядит довольно просто. Он имеет два статических метода, один публичный и один частный .

Оба метода принимают аргумент типа String и возвращают в качестве результата строку .

Теперь давайте вызовем два статических метода с помощью Java Reflection API. В этом руководстве мы рассмотрим код как методы модульного тестирования.

3. Вызов общедоступного статического метода

Во-первых, давайте посмотрим, как вызвать общедоступный статический метод:

@Test
void invokePublicMethod() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class<GreetingAndBye> clazz = GreetingAndBye.class;
Method method = clazz.getMethod("greeting", String.class);

Object result = method.invoke(null, "Eric");

Assertions.assertEquals("Hey Eric, nice to meet you!", result);
}

Следует отметить, что нам необходимо обрабатывать необходимые проверенные исключения , когда мы используем Reflection API.

В приведенном выше примере мы сначала получаем экземпляр класса, который мы хотим протестировать, который называется GreetingAndBye .

Получив экземпляр класса, мы можем получить объект общедоступного статического метода, вызвав метод getMethod .

Как только мы получим объект метода , мы можем вызвать его, просто вызвав метод вызова .

Стоит объяснить первый аргумент метода вызова . Если метод является методом экземпляра, первым аргументом является объект, из которого вызывается базовый метод.

Однако, когда мы вызываем статический метод, мы передаем null в качестве первого аргумента , поскольку статические методы не требуют экземпляра для вызова.

Наконец, если мы запустим тест, он пройдет.

3. Вызов частного статического метода

Вызов частного статического метода очень похож на вызов общедоступного . Давайте сначала посмотрим на код:

@Test
void invokePrivateMethod() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
Class<GreetingAndBye> clazz = GreetingAndBye.class;
Method method = clazz.getDeclaredMethod("goodBye", String.class);
method.setAccessible(true);

Object result = method.invoke(null, "Eric");

Assertions.assertEquals("Bye Eric, see you next time.", result);
}

Как видно из приведенного выше кода, когда мы пытаемся получить объект Method частного метода, мы должны использовать getDeclaredMethod вместо getMethod .

Более того, нам нужно вызвать method.setAccessible(true) для вызова приватного метода . Это попросит JVM подавить проверки контроля доступа для этого метода.

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

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

4. Вывод

В этой короткой статье мы рассмотрели, как вызывать статические методы с помощью Java Reflection API.

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