Unknown Region

プログラムでハマったエラーとその解決方法についての備忘録メモ

【Java】アクセス修飾子の問題でアクセスできないEnumをリフレクションで取得する

個人的メモ。

あるライブラリを弄っていて、アクセス修飾子がついていないEnumインスタンスを引数に要求するメソッドに出くわしたのでこの方法を使った。

(そのメソッド自体はpublicなので、恐らくアクセス修飾子の考慮漏れか修正ミスだとは思う)

例: DemoType.java

package secret;

enum DemoType {
  HOGE, FUGA, FOO, BAR
}

この[DemoType]には修飾子がついていないので、このenumが属している[secret]というパッケージに属しているプログラムからしか参照できない。

(普通に使おうとしてもコンパイルエラーとなる)

どうしても使いたい場合は、リフレクションで無理やり取得することが可能。

例: Demo.java

public class Demo {
  public static void main(String... args) throws ClassNotFoundException {
    Class<?> clazz = Class.forName("secret.DemoType");
    Enum<?>[] elements = (Enum[]) clazz.getEnumConstants();
    for (Enum<?> element : elements) {
      System.out.println(element.name()); // enumの名称を出力する
    }
  }
}

実行結果: Demo.java

HOGE
FUGA
FOO
BAR

[Class.getEnumConstants()]はObjectの配列を返却するが、Enumの配列へキャストすることで、Enumとしての機能を使うことができる。

ここから更に対象の要素に絞りたいならば[Enum.name()]を使って絞り込めば良い。

ただリフレクションを使うと処理パフォーマンスが劣化するので

  • (当たり前だが)[DemoType]が編集可能ならば[public]へ変更する
  • [Demo][secret]パッケージへ変更する

のどちらかを選択する方が現実的だろう。

 

連絡先: plugout777★yahoo.co.jp (クローラー対策のため★を@に変更してください)