はじめに
Javaのリフレクションは強力な機能の1つだと思います。
しかし、強力であるが故に使い方を誤ると想定しない問題を発生させてしまう可能性もあると想像します。
特にJDK内部APIというコア機能に対する操作はより影響が大きいと言えるでしょう。
その様な背景も有るのか、バージョンアップに伴ってその利用について調整が発生しています。
今回はそれらを時系列的に見てみました。
JDK8以前
特に制限等は見付けられませんでした。
JDK11
WARNING: An illegal reflective access operation has occurred
このバージョンから危険性が認識される様に、警告が出力される様になっている様です。
しかし、未だ警告の段階で有り、--illegal-access パラメータで警告や許可、不許可を設定可能です。
- illegal-access 設定例
- warn : 警告の出力
- permit : リフレクティブなアクセスの許可
- deny : リフレクティブなアクセスの拒否
JDK16
デフォルトのillegal-accessがdenyになっています。
しかし、未だillegal-accessをpermitへと設定する事で、利用する事が可能な状態は残されています。
JDK17以降
前バージョン迄選択出来ていたillegal-accessのpermitが設定不可となりました。
従って、このバージョンからJDK内部APIへのリフレクティブなアクセスを行う手段は無くなった、
と捉えました。
おわりに
個人的には、バージョン間の差異に着目する事は多くても、1つの機能や利用方法について複数バージョンを追いかけてみる事は無かったので、改めて見ると新鮮でした。
私個人が想定していたより、完全に選択肢を閉じる迄に、警告、オプションによる選択、と
ユーザに対して移行の期間を設けてくれているのだな、と感じました。