🤸

【Java】Classに定義されているメソッドから可視性を取得する

2021/03/06に公開

概要

Javaのクラス情報(java.lang.Class)からメソッド(java.lang.reflect.Method)の一覧を取得できるのですが、その可視性(publicなど)はMethodで定義されているメソッドでは直接取得できないように見えます。もちろん実際は取得できる方法があるのですが、その取得方法を少し調べてみたので今回書きます。

前提や対応方法

  • 今回はjava.lang.ClassからgetDeclaredMethodsを使って、メソッドの一覧を取得します。こちらの記事にある通り、getMethods()ではpublicのメソッドしか取得できないので。
  • 可視性を取得するにはこちらの記事にある通り、まずはMethodからgetModifiersを呼んで、言語修飾子の整数値を取得します。その整数値をModifierクラスを使って判定します。
    Modifierクラスについてはクラス・メンバーの属性の記事も参考になります。

実装サンプル

メソッドの可視性を取得して、文字列としてメソッド名と一緒に出力します。

public static void outputMethodVisibility(Class c) {
    Arrays.stream(c.getDeclaredMethods())
        .forEach(m -> {
            if (Modifier.isPublic(m.getModifiers())) {
                System.out.print("public ");
            } else if (Modifier.isPrivate(m.getModifiers())) {
                System.out.print("private ");
            } else if (Modifier.isProtected(m.getModifiers())) {
                System.out.print("protected ");
            } else {
                System.out.println("package private ");
            }
            System.out.println(m.getName());
        });
}

Discussion