1. 概述

在这个快速教程中,我们将讨论如何使用Java反射API调用静态方法。我们将涵盖两种不同情况:

  • 静态方法是公共的。
  • 静态方法是私有的。

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参数,并返回一个String作为结果。

现在,让我们使用Java反射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);
}

需要注意的是,当我们使用反射API时,需要处理所需的检查异常

在上面的示例中,我们首先获取要测试的类的实例,即GreetingAndBye

有了类实例后,我们可以通过调用*getMethod*方法获取公共静态方法的对象。

一旦我们拥有method对象,就可以简单地通过调用*invoke*方法来调用它。

值得解释的是,invoke方法的第一个参数。如果方法是实例方法,第一个参数是调用底层方法的对象。

然而,当调用静态方法时,我们将第一个参数设置为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);
}

如代码所示,当我们尝试获取private方法的Method对象时,应该使用getDeclaredMethod*而不是getMethod***。

此外,我们需要调用*method.setAccessible(true)*来调用private方法。这将请求JVM对这个方法的访问控制检查进行抑制。

因此,我们可以调用私有方法。否则,将会抛出IllegalAccessException异常。

如果执行测试,它会通过。

4. 总结

在这篇短文中,我们探讨了如何使用Java反射API调用静态方法。如往常一样,完整的代码可以在GitHub上找到