00024.06 反射:反射的應用2:動態建立物件
系列文章目錄
前言
怎麼建立物件?首先得先獲取Class物件才能建立物件
一、在執行時建立任意引用資料型別的物件
方式一:使用Class物件直接new物件
怎麼建立物件?首先得先獲取Class物件才能建立物件
(1)獲取某個型別的Class物件
(2)通過Class物件來建立這個Class所代表的型別的物件
方式二:通過Class物件先獲取有參構造,然後再建立物件
(1)獲取某個型別的Class物件
(2)通過Class物件來獲取Constructor物件
(2)通過Constructor物件來建立這個Class所代表的型別的物件
說明
(1)Constructor clazz.getConstructor(Class<?>… parameterTypes)某個公共的構造器
(2)Constructor clazz.getDeclaredConstructor(Class<?>… parameterTypes)某個宣告的構造器
一個類中可能存在多個構造器,但是多個構造器過載的話,形參列表一定不一樣,所以通過形參列表就可以唯一的定位到一個構造器
如果Class<?>… parameterTypes,一個都不傳,即獲取無參構造
二、完整程式碼
package com.atguigu.test07;
import java.lang.reflect.Constructor;
import org.junit.Test;
import com.atguigu.ext.demo.AtGuiguDemo;
/*
* 2、在執行時能夠建立任意引用資料型別的物件
*
* 方式一:使用Class物件直接new物件
* 步驟:
* (1)獲取某個型別的Class物件
* (2)通過Class物件來建立這個Class所代表的型別的物件
*
* 當AtGuiguDemo沒有無參構造時
* java.lang.InstantiationException: com.atguigu.ext.demo.AtGuiguDemo
* Caused by: java.lang.NoSuchMethodException: com.atguigu.ext.demo.AtGuiguDemo.<init>()
*
*
* 方式二:通過Class物件先獲取有參構造,然後再建立物件
* 步驟:
* (1)獲取某個型別的Class物件
* (2)通過Class物件來獲取Constructor物件
* (2)通過Constructor物件來建立這個Class所代表的型別的物件
*/
public class TestNewInstance {
@Test
public void test03(){
// AtGuiguDemo s = new AtGuiguDemo(2,"xx",20);//The constructor AtGuiguDemo(int, String, int) is not visible
// System.out.println(s);
}
@Test
public void test02() throws Exception{
//(1)獲取某個型別的Class物件
Class clazz = Class.forName("com.atguigu.ext.demo.AtGuiguDemo");
/*
* (1)Constructor clazz.getConstructor(Class<?>... parameterTypes)某個公共的構造器
* (2)Constructor clazz.getDeclaredConstructor(Class<?>... parameterTypes)某個宣告的構造器
* 一個類中可能存在多個構造器,但是多個構造器過載的話,形參列表一定不一樣,所以通過形參列表就可以唯一的定位到一個構造器
* 如果Class<?>... parameterTypes,一個都不傳,即獲取無參構造
*/
//(2)獲取有參構造物件
Constructor c = clazz.getDeclaredConstructor(int.class,String.class,int.class);
c.setAccessible(true);
//(3)通過Constructor物件來建立例項物件
Object obj = c.newInstance(1,"尚矽谷",10);//這裡的newInstance(實參列表),因為它用有參構造建立物件
System.out.println(obj);
}
@Test
public void test01() throws ClassNotFoundException, InstantiationException, IllegalAccessException{
//(1)獲取某個型別的Class物件
Class clazz = Class.forName("com.atguigu.ext.demo.AtGuiguDemo");
//(2)建立物件
//obj的編譯時型別,Object型別
//obj的執行時型別是AtGuiguDemo型別
Object obj = clazz.newInstance();//這裡的newInstance()沒有引數,因為它是用無參構造建立例項
System.out.println(obj);
}
}
總結
相關文章
- 使用反射-動態建立物件及呼叫物件方法反射物件
- Java中物件的動態建立及其反射機制Java物件反射
- 反射的應用反射
- Spring 解耦反射建立物件Spring解耦反射物件
- Java反射的應用Java反射
- 使用反射建立窗體物件時,物件為NULL反射物件Null
- 【譯】2. Java反射——Class物件Java反射物件
- PHP 反射之動態代理PHP反射
- java 反射和動態代理Java反射
- java反射構建物件和方法的反射呼叫Java反射物件
- C#根據反射動態建立ShowDoc介面文字資訊C#反射
- 運用反射實現ejb動態委派 (轉)反射
- java反射技術的應用Java反射
- SSM(九) 反射的實際應用 - 構建日誌物件SSM反射物件
- Protobuf_動態訊息-反射反射
- 反射機制及應用反射
- 物件導向 -- 反射物件反射
- 反射_Class物件功能反射物件
- java反射——實現程式的動態性Java反射
- 反射-動態代理的概述和實現反射
- Java反射動態修改註解的值Java反射
- 反射和代理的具體應用反射
- java反射(2)Java反射
- Java動態代理和反射機制Java反射
- 【譯】11. Java反射——動態代理Java反射
- 應用反射進行開發反射
- 安卓應用優化:使用反射測試安卓裝置是否使用“動態桌布”安卓優化反射
- [.net 物件導向程式設計進階] (20) 反射(Reflection)(上)利用反射技術實現動態程式設計物件程式設計反射
- JAVA的反射機制==>用反射分析類的實現Java反射
- 深入理解 Java 反射和動態代理Java反射
- 深入淺出MyBatis:反射和動態代理MyBatis反射
- 通過Java反射動態獲取資訊Java反射
- C#反射的Assembly的簡單應用C#反射
- 反射的妙用:C#通過反射動態生成型別繼承介面並實現反射C#型別繼承
- Go語言反射(reflect)及應用Go反射
- Java 反射機制應用實踐Java反射
- Java反射機制應用實踐Java反射
- java反射方式建立例項Java反射