Java 9 replace Class.newInstance

Viewed 18131

Class.newInstance was deprecated in Java 9:

clazz.newInstance()

can be replaced by

clazz.getDeclaredConstructor().newInstance()

The problem is that getDeclaredConstructor returns any constructor without regarding the access level.

If I want to replace all occurrences in my code (on different packages/access level) should I use getConstructor to get the public constructor?

the Constructor object of the public constructor that matches the specified parameterTypes

Or can't I bulk replace all occurrences because it needs to be per case (if a public constructor exists and/or if I have the right access level for the class)?

EDIT

getDeclaredConstructor:

   return getConstructor0(parameterTypes, Member.DECLARED);

getConstructor:

   return getConstructor0(parameterTypes, Member.PUBLIC);
1 Answers

These two calls invoke the same constructor, the zero-argument constructor:

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

Both perform the same run-time check to verify the caller's access, if the constructor is not public. The only difference is that #2 wraps any checked exceptions instead of directly throwing. Otherwise they are identical and you can replace one with the other.

But this is different:

  1. klass.getConstructor().newInstance()

because it can only return a public constructor. It throws a NoSuchMethodException if the constructor is not public.

So you can't change it to getConstructor() unless you know the constructor is public.

Related