Wednesday, April 11, 2007
Instantiating a java Object bypassing constructor
One more interesting fact i have come across today is we can instantiate a java object bypassing a constructor.
We have a class which have a constructor with some arguments and doesn't contains no argument constructor. If we try to create a object by calling default constructor it will throw an error.
Below example shows what i have said above.
class PersonalDetails {
private String fname;
private String lname;
private int id;
public PersonalDetails(String fname, String lname, int id){
this.fname=fname;
this.lname=lname;
this.id=id;
}
public String getFname() {
return fname;
}
public void setFname(String fname) {
this.fname = fname;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getLname() {
return lname;
}
public void setLname(String lname) {
this.lname = lname;
}
}
public class Instantiation
{
public static void main(String[] args) {
PersonalDetails personalDetails = new PersonalDetails();
}
}
When tried to run, it will give the following error
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The constructor PersonalDetails() is undefined
at Instantiation.main(Instantiation.java:45)
But with Objenesis we can create a object bypassing constructor.
Below example shows how to create a object bypassing constructor.
import org.objenesis.Objenesis;
import org.objenesis.ObjenesisStd;
import org.objenesis.instantiator.ObjectInstantiator;
class PersonalDetails {
private String fname;
private String lname;
private int id;
public PersonalDetails(String fname, String lname, int id){
this.fname=fname;
this.lname=lname;
this.id=id;
}
public String getFname() {
return fname;
}
public void setFname(String fname) {
this.fname = fname;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getLname() {
return lname;
}
public void setLname(String lname) {
this.lname = lname;
}
}
public class Instantiation
{
public static void main(String[] args) {
Objenesis objenesis = new ObjenesisStd(); // or ObjenesisSerializer
ObjectInstantiator pDInstantiator = objenesis.getInstantiatorOf(PersonalDetails.class);
PersonalDetails personalDetails =(PersonalDetails)pDInstantiator.newInstance();
System.out.println("fname="+personalDetails.getFname()+" | lname="+personalDetails.getLname()+" | id="+personalDetails.getId());
}
}
Output:-
fname=null | lname=null | id=0
Note:- objenesis.jar is required for the above program to work. You can find the jar in the link provided below
Below link contains much more info about Objenesis.
http://objenesis.googlecode.com/svn/docs/index.html
