Class.newInstance() からコンストラクター・リフレクションへ
非推奨の Class.newInstance() を、明示的なコンストラクターの検索と呼び出しに置き換えます。
コード比較
✕ Deprecated Class.newInstance()
Plugin plugin = pluginClass.newInstance();
✓ Constructor reflection
Plugin plugin = pluginClass
.getDeclaredConstructor()
.newInstance();
このコードに問題がありますか? お知らせください。
モダンな方法が優れている理由
サポート対象の API
非推奨の Class.newInstance() を使用しません。
明示的なコンストラクター
要求したシグネチャが明確になり、引数も指定できます。
正確な失敗通知
コンストラクターの例外は InvocationTargetException で表されます。
旧来のアプローチ
Class.newInstance()
モダンなアプローチ
明示的なコンストラクター検索
JDKバージョン
9
難易度
中級
JDKサポート
Class.newInstance() からコンストラクター・リフレクションへ
利用可能
Class.newInstance() が JDK 9(2017 年 9 月)で非推奨になって以降、推奨されています。
仕組み
Class.newInstance() は、コンストラクターがスローする例外のコンパイル時チェックを回避でき、引数なしコンストラクターしかサポートしないため非推奨です。明示的に Constructor を検索すると、選択したシグネチャが明確になり、リフレクション呼び出しの失敗が適切なリフレクション例外として報告されます。モジュールとアクセスの規則は引き続き適用されます。このパターンはカプセル化の回避を推奨するものではありません。
関連ドキュメント
証明