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 .