54
32

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Class.newInstance()はJava9から非推奨になるので今から書き方を変えておこう

Last updated at Posted at 2017-03-21

前置き

ちょっと前にこんなツィートを見かけました。

本当かな?と確認してみました。

確認環境

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の取り消し線が表示されていることが確認出来ます。
save.PNG

動かしてみると

警告は表示されますが、正常終了します。
save1.PNG
save2.PNG

どう書き換えればよいのか

発端のツィートのリンク先にも記載がありますように、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でコメントを戴きました。

気を付けないといけないこと

リフレクションで検索して出てくるコードの大半は、Java9で非推奨になる書き方をしています。
いつ廃止されるのかはまだ明言されていませんが、いつメソッドが消えるかわかりませんので転がっているコードをコピペする際は気を付けましょう。

54
32
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
54
32

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?