1. 概要

このクイックチュートリアルでは、 ReflectionAPIを使用してJavaで静的メソッドを呼び出す方法について説明します。

2つの異なるシナリオについて説明します。

  • 静的メソッドはpublicです。
  • 静的メソッドはprivateです。

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クラスは非常に単純に見えます。 2つのstaticメソッドがあり、1つは public 、もう1つはprivateです。

どちらのメソッドもString引数を受け入れ、結果としてStringを返します。

それでは、JavaReflectionAPIを使用して2つの静的メソッドを呼び出しましょう。 このチュートリアルでは、コードを単体テストメソッドとして扱います。

3. public staticメソッドの呼び出し

まず、 public staticメソッドを呼び出す方法を見てみましょう。

@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メソッドを呼び出してパブリック静的メソッドオブジェクトを取得できます。

method オブジェクトを保持すると、invokeメソッドを呼び出すだけで呼び出すことができます。

invokeメソッドの最初の引数を説明することは価値があります。 メソッドがインスタンスメソッドの場合、最初の引数は、基になるメソッドが呼び出されるオブジェクトです。

ただし、静的メソッドを呼び出すときは、最初の引数としてnullを渡します。静的メソッドは呼び出されるためにインスタンスを必要としないためです。

最後に、テストを実行すると合格します。

3. private staticメソッドの呼び出し

private static メソッドの呼び出しは、publicメソッドの呼び出しと非常によく似ています。 最初にコードを見てみましょう:

@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オブジェクトを取得しようとするときは、getMethodの代わりにgetDeclaredMethodを使用する必要があります。

さらに、プライベートメソッドを呼び出すには、method.setAccessible(true)を呼び出す必要があります。 これにより、JVMはこのメソッドのアクセス制御チェックを抑制します。

したがって、プライベートメソッドを呼び出すことができます。 そうしないと、IllegalAccessException例外が発生します。

テストを実行すると合格します。

4. 結論

この短い記事では、JavaReflectionAPIを使用して静的メソッドを呼び出す方法について説明しました。

いつものように、完全なコードはGitHubにあります。