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