通過Class對象獲取對象的方式是通過class.newInstance()方式獲取,通過調用默認構造參數實例化一個對象。
1 /** 2 * Created by hunt on 2017/6/27. 3 * 測試的實體類 4 * @Data 編譯后會自動生成set、get、無慘構造、equals、canEqual、hashCode、toString方法 5 */ 6 @Data 7 public class Person { 8 private String name; 9 private int age; 10 }
1 /** 2 * Created by hunt on 2017/6/27. 3 */ 4 public class NewInstanceTest { 5 public static void main(String[] args) { 6 Class<Person> personClass = Person.class;//獲取Class實例 7 try { 8 Person p = personClass.newInstance();//通過Class獲得Person實例 9 p.setAge(28); 10 p.setName("hunt"); 11 System.out.println(p); 12 } catch (InstantiationException e) { 13 e.printStackTrace(); 14 } catch (IllegalAccessException e) { 15 e.printStackTrace(); 16 } 17 } 18 }
提示:class.newInstance()是通過無參構造函數實例化的,一個對象默認是有一個無參構造函數,如果有一個有參構造函數,無參構造函數就不存在了,在通過反射獲得對象會拋出 java.lang.InstantiationException 異常。
1 /** 2 * Created by hunt on 2017/6/27. 3 * 測試的實體類 4 */ 5 6 public class Person { 7 private String name; 8 private int age; 9 10 public String getName() { 11 return name; 12 } 13 14 public int getAge() { 15 return age; 16 } 17 18 public void setName(String name) { 19 this.name = name; 20 } 21 22 public void setAge(int age) { 23 this.age = age; 24 } 25 26 public Person(String name,int age){}//有參數構造函數 27 }
1 /** 2 * Created by hunt on 2017/6/27. 3 */ 4 public class NewInstanceTest { 5 public static void main(String[] args) { 6 Class<Person> personClass = Person.class;//獲取Class實例 7 try { 8 Person p = personClass.newInstance();//通過Class獲得Person實例 9 p.setAge(28); 10 p.setName("hunt"); 11 System.out.println(p.getAge()+"----"+p.getName()); 12 } catch (InstantiationException e) { 13 e.printStackTrace(); 14 } catch (IllegalAccessException e) { 15 e.printStackTrace(); 16 } 17 } 18 }
總結:以后創建實體類的時候一定要帶上無參構造函數,以便以后使用反射的時候實例化對象不拋出異常。