Search code examples
javareflectionconstructorjava-9

Java 9 replace Class.newInstance


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);

Solution

  • 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.