Java反射機制demo(二)—經過Class實例化任意類的對象

 Java反射機制demo(二)—經過Class實例化任意類的對象

上一章節中,實例化了Class類對象的實例,這個部分的demo展現瞭如何使用Class對象的實例去得到其餘類的對象的實例。java

任意一個類,UserInfo,ide

 1 package com.aaron.reflect;
 2 
 3 public class UserInfo{
 4     private int userId;
 5     private String name;
 6     private int age;
 7     
 8     public int getUserId() {
 9         return userId;
10     }
11     public void setUserId(int userId) {
12         this.userId = userId;
13     }
14     public String getName() {
15         return name;
16     }
17     public void setName(String name) {
18         this.name = name;
19     }
20     public int getAge() {
21         return age;
22     }
23     public void setAge(int age) {
24         this.age = age;
25     }
26     @Override
27     public String toString() {
28         return "UserInfo [userId=" + userId + ", name=" + name + ", age=" + age + "]";
29     }
30     
31 }
32  

 

 使用newInstance方法,經過調用默認的無參構造來實例化一個UserInfo的對象函數

 1 package com.aaron.reflect;
 2 
 3 public class Demo1 {
 4     public static void main(String[] args) {
 5         Class<?> c = UserInfo.class;//得到Class類實例
 6         UserInfo userInfo = null;
 7         
 8         try {
 9             userInfo = (UserInfo) c.newInstance();//經過Class類的實例得到UserInfo的實例
10         } catch (InstantiationException e) {
11             e.printStackTrace();
12         } catch (IllegalAccessException e) {
13             e.printStackTrace();
14         }
15         
16         userInfo.setUserId(1);
17         userInfo.setName("Squee,Spleen and Goblin");
18         userInfo.setAge(10);
19         
20         System.out.println(userInfo);
21     }
22 }
23  

 

 若是瞭解Java虛擬機,應該知道,一個對象在new以前,堆裏是不會分配內存的。所以這個UserInfo的實例是經過Class的實例獲得的。this

運行結果:spa

 

UserInfo [userId=1, name=Squee,Spleen and Goblin, age=10]

 

注意事項:code

newInstance()調用的是無參的空構造,若是隻有參數的構造函數:以下:對象

private int userId;
private String name;
private int age;
	
public UserInfo(int userId, String name, int age) {
	super();
	this.userId = userId;
	this.name = name;
	this.age = age;
}

運行Demo,拋出異常:blog

java.lang.InstantiationException: com.aaron.reflect.UserInfo
at java.lang.Class.newInstance(Class.java:359)
at com.aaron.reflect.Demo1.main(Demo1.java:9)
Exception in thread "main" java.lang.NullPointerException
at com.aaron.reflect.Demo1.main(Demo1.java:16

此時,要定義一個空的構造函數(顯式地聲明一個空的構造函數)。 內存

因此,顯式聲明空的構造函數有時候也是一種很好的習慣。當你要使用反射時,必定不要忘記空的構造。get

相關文章
相關標籤/搜索