前置き
ちょっと前にこんなツィートを見かけました。
Java 9 から java.lang.Class newInstance が deprecated になるのか、へーhttps://t.co/AI28VSqKS8
— Kenji Yoshida (@xuwei_k) 2017年3月14日
本当かな?と確認してみました。
確認環境
Java9
JDK 9 Early Access Releases — Project Kenai から最新版をダウンロードしました。
(Build 161 で確認しました)
IDEA
eclipseだとJava9を認識してくれなかったので、認識してくれるintellijを使用しました。
ただし、注意点が合って、Version: 2016.3.4だとプログラムが動きませんでした。
そのため、IntelliJ IDEA: Early Access Program builds からIntelliJ IDEA 2017.1のEarly Access Programをダウンロードしています。
使ったプログラム
JavaでReflection 第一回:コンストラクタ編 - Qiita に出てくるプログラムをお借りしました。
確認結果
見た目
Deprecatedの取り消し線が表示されていることが確認出来ます。
動かしてみると
どう書き換えればよいのか
発端のツィートのリンク先にも記載がありますように、getDeclaredConstructor().newInstance() と書き換えましょう。
Bean bean = Bean.class.newInstance();
System.out.println(bean.pubVar); // default pubVar
これが
Bean bean = Bean.class.getDeclaredConstructor().newInstance();
System.out.println(bean.pubVar); // default pubVar
こうなるだけです。
Class (Java Platform SE 8 ) を読むとJDK1.1から既に存在するメソッドなので、今お使いのバージョンが何であれ、使用可能です。
※バグが潜んでいる可能性は否定できないので、念のため書き換えた後は動作確認しましょう。
そもそもなぜ非推奨になったのか?
Class.newInstance()は、宣言されていないチェック例外を送出できてしまう - しおしお
この対策なのかな?と思いましたが、明確なソースを見つけられていません。
議論源などご存じの方は指摘していただけると助かります。
2017/3/22 追記
Twitterでコメントを戴きました。
こういう経緯で deprecated になったのね。なるへそ:
— 古賀信哉 (Shin-ya Koga) (@shkoga) 2017年3月21日
https://t.co/zJn1FajvXi
https://t.co/mP8m8MTuHW https://t.co/8WCS20vn2f
気を付けないといけないこと
リフレクションで検索して出てくるコードの大半は、Java9で非推奨になる書き方をしています。
いつ廃止されるのかはまだ明言されていませんが、いつメソッドが消えるかわかりませんので転がっているコードをコピペする際は気を付けましょう。