web-dev-qa-db-fra.com

Java 9 remplace Class.newInstance

Class.newInstance a été déconseillé dans Java 9:

clazz.newInstance()

peut être remplacé par

clazz.getDeclaredConstructor().newInstance()

Le problème est que getDeclaredConstructor renvoie tout constructeur sans tenir compte du niveau d'accès.

Si je veux remplacer toutes les occurrences de mon code (sur différents packages/niveau d'accès) dois-je utiliser getConstructor pour obtenir le constructeur public?

l'objet Constructor du constructeur public qui correspond aux parameterTypes spécifiés

Ou ne peut pas I bulk remplacer toutes les occurrences car cela doit être par cas (si un constructeur public existe et/ou si j'ai le bon niveau d'accès pour la classe)?

[~ # ~] modifier [~ # ~]

getDeclaredConstructor:

   return getConstructor0(parameterTypes, Member.DECLARED);

getConstructor:

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

Ces deux appels invoquent le même constructeur, le constructeur à zéro argument:

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

Les deux effectuent la même vérification d'exécution pour vérifier l'accès de l'appelant, si le constructeur n'est pas public. La seule différence est que # 2 encapsule toutes les exceptions vérifiées au lieu de les lancer directement. Sinon, ils sont identiques et vous pouvez remplacer l'un par l'autre.

Mais c'est différent:

  1. klass.getConstructor().newInstance()

car il ne peut renvoyer qu'un constructeur public. Il lance un NoSuchMethodException si le constructeur n'est pas public.

Vous ne pouvez donc pas le changer en getConstructor() sauf si vous savez que le constructeur est public.

9
Boann