Use java reflection api to access private constructor of a class and create an instance
Author : Anurag Anand
This code will work in Java 9 and above.
You can watch my Youtube video, where I am working on this code.
[embed]https://youtu.be/cEXCjlV86dc[/embed]
In java, we can use reflection apis to access all the properties of a java class.
In this blog, I will show you how you can make a private constructor public and use it to create an instance of that class.
I will create a a class Person, with a private constructor.
public class Person{
private final String firstName;
private final String lastName;
private Person(final String firstName, final String lastName){
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName(){ return this.firstName; }
public String getLastName() { return this.lastName; }
@Override
public String toString(){
return "{ FirstPerson : " + this.firstName+ ", LastPerson : " + this.lastName + "}";
}
}
To create an instance, first you need to get a reference to that constructor.
Class<Person> personClass = Person.class;
Constructor<?>[] constructors = personClass.getDeclaredConstructors();
Constructor<?> privateConstructor = constructors[0];
We get a reference to the class object, then we get a reference to array of constructors. As we know, we have only one constructor, so we can get a reference to that by accessing index-zero of array of constructor.
Once we have access to the constructor object, we make that constructor accessible.
privateConstructor.setAccessible(true);
Then we call newInstance method on it, with proper arguments.
final Person person = (Person) privateConstructor.<Person>newInstance("Anurag", "Anand");
System.out.println(person);
Full Source Code :-
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Constructor;
public class ReflectTest{
public static void main(final String ... args)
throws
InstantiationException,
IllegalAccessException,
InvocationTargetException
{
Class<Person> personClass = Person.class;
Constructor<?>[] constructors = personClass.getDeclaredConstructors();
Constructor<?> privateConstructor = constructors[0];
privateConstructor.setAccessible(true);
final Person person = (Person) privateConstructor.<Person>newInstance("Anurag", "Anand");
System.out.println(person);
}
}