简体   繁体   中英

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

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM