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]パッケージへ変更する

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

 

【Java】Lombokの拡張を行う

Lombokを拡張する方法を探していたのだが、想定していたよりも情報量が少なかったので備忘録がてらここへ記録。

projectlombok.org

 

結果として、日本語、英語、中国語の技術記事をかき集めることになった。

カスタマイズはjavacのtools.jarを扱うことになるので、ハードルは割と高め。

(javacパッケージの圧倒的なドキュメント不足に苦しむことになるので、基本的には実装済みのコードを漁ることになるはず)

ちなみにLombokのv1.18.16(2021/01/11時点での最新版)のビルドにはJava11以降が必要。

一応、以下の手順で一応カスタマイズ自体とJARのビルドが可能。

(Java11以降とApache Antのインストールが必要なため、Dockerの利用前提)

(Gitは予めインストールしておくこと)

 

手順: 環境構築(Docker起動まで)

# LombokのプロジェクトをGitHubからクローン
git clone https://github.com/rzwitserloot/lombok.git

# プロジェクト内(lombok)へ移動
cd lombok

# CentOSのイメージを起動
docker run -it --rm -v `pwd`:/lombok centos:centos7

 

手順: Dockerログイン後

# CentOS内にyumで必要なものをinstall
yum -y install which wget java-11-openjdk-devel

# antのインストール
mkdir /tmp/ant
cd /tmp/ant
wget http://www.apache.org/dist/ant/binaries/apache-ant-1.10.9-bin.tar.gz
tar zxvf apache-ant-1.10.9-bin.tar.gz
mv apache-ant-1.10.9 /usr/share/ant
ln -s /usr/share/ant/bin/ant /usr/bin/ant

# version確認
ant -version # Apache Ant(TM) version 1.10.9 compiled on September 27 2020
java -version # openjdk version "11.0.9.1" 2020-11-04 LTS

# lombokのディレクトリへ移動(Dockerのvオプションで指定した場所)
cd /lombok

# lombok.jarの作成(ビルド)
ant dist

問題がなければ、distディレクトリ配下にlombok.jarが出来上がるはず。

ちなみにバージョンについては[src/core/lombok/core/Version.java]で管理されている模様。

 

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