1. 程式人生 > >java 利用反射建立執行時類的物件

java 利用反射建立執行時類的物件

java 利用反射建立執行時類的物件

1. java 利用反射建立執行時類的物件

1.1. 建立類的物件:呼叫Class物件的newInstance()方法

要 求:

  1. 類必須有一個無引數的構造器。(預設無參,指定呼叫有參的構造器)
  2. 類的構造器的訪問許可權需要足夠。

難道沒有無參的構造器就不能建立物件了嗎?
不是!只要在操作的時候明確的呼叫類中的構造方法,並將引數傳遞進去之後,才可以例項化操作。步驟如下:

  1. 通過Class類的getDeclaredConstructor(Class … parameterTypes)取得本類的指定形參型別的構造器
  2. 向構造器的形參中傳遞一個物件陣列進去,裡面包含了構造器中所需的各個引數。
  3. 在Constructor類中存在一個方法
    public T newInstance(Object … initargs)

注:以上為反射最常用的和用的最多的地方了

2.例子demo

  1. 程式碼
@Test
	public void test1() throws Exception {
		String className = "testReflection.Person";
		Class clazz = Class.forName(className);
		//建立對應的執行時類的物件.使用newInstance(),實際就是呼叫了執行時類的空參的構造器
		//要想能夠建立承購:①要求對應的執行時類要有空參的構造器
		//②構造器的許可權修飾符的許可權要足夠
		Object obj = clazz.newInstance();
		Person p = (Person)obj;
		System.out.println(p);		
	}
  1. 總結
  2. 建立類的時候,儘量保留空參的構造器
    好處:
    • 有可能我們要通過Java反射機制去建立類物件
    • 子類例項化的時候,會呼叫父類的空參構造器,如果沒有空參構造器,會報錯

3. 反射建立物件和正常物件的底層理解

  1. 其實兩種方法都是通過呼叫類的構造器(Constructor)建立物件的,只是反射的方法,是先有一個大的Class類,再去找到其對應的構造器,然後建立。
  2. 正常方式的建立物件是當我們new 的時候,就已經呼叫的構造器去建立物件了。