web-dev-qa-db-ja.com

Java 9はClass.newInstanceを置き換えます

Class.newInstance は、Java 9:

clazz.newInstance()

に置き換えることができます

clazz.getDeclaredConstructor().newInstance()

問題は、 getDeclaredConstructor がアクセスレベルに関係なくコンストラクタを返すことです。

コード内のすべての出現を(異なるパッケージ/アクセスレベルで)置き換えたい場合、 getConstructor を使用してパブリックコンストラクターを取得する必要がありますか?

指定されたparameterTypesに一致するパブリックコンストラクターのConstructorオブジェクト

またはca n'tIbulkすべての出現を置換するコンストラクタが存在する、および/またはクラスに適切なアクセスレベルがある場合)

[〜#〜] edit [〜#〜]

getDeclaredConstructor:

   return getConstructor0(parameterTypes, Member.DECLARED);

getConstructor:

   return getConstructor0(parameterTypes, Member.PUBLIC);
14
user7294900

これらの2つの呼び出しは、同じコンストラクターである引数ゼロのコンストラクターを呼び出します。

  1. klass.newInstance()
  2. klass.getDeclaredConstructor().newInstance()

コンストラクターがパブリックでない場合、どちらも同じランタイムチェックを実行して呼び出し元のアクセスを確認します。唯一の違いは、#2が直接スローするのではなく、チェックされた例外をラップすることです。それ以外は同一であり、一方を他方に置き換えることができます。

しかし、これは異なります:

  1. klass.getConstructor().newInstance()

パブリックコンストラクターのみを返すことができるためです。コンストラクターがパブリックでない場合、NoSuchMethodExceptionをスローします。

そのため、コンストラクタがパブリックであることを知らない限り、getConstructor()に変更することはできません。

9
Boann