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);
}
}
總結
相關文章
- Spring 解耦反射建立物件Spring解耦反射物件
- 反射的應用反射
- 使用反射建立窗體物件時,物件為NULL反射物件Null
- java反射構建物件和方法的反射呼叫Java反射物件
- PHP 反射之動態代理PHP反射
- java 反射和動態代理Java反射
- 物件導向 -- 反射物件反射
- 反射_Class物件功能反射物件
- C#根據反射動態建立ShowDoc介面文字資訊C#反射
- 反射機制及應用反射
- Protobuf_動態訊息-反射反射
- 反射和代理的具體應用反射
- Java反射動態修改註解的值Java反射
- Java動態代理和反射機制Java反射
- 反射的妙用:C#通過反射動態生成型別繼承介面並實現反射C#型別繼承
- 深入理解 Java 反射和動態代理Java反射
- 深入淺出MyBatis:反射和動態代理MyBatis反射
- Go語言反射(reflect)及應用Go反射
- java反射方式建立例項Java反射
- C#反射的委託建立器C#反射
- 安卓應用優化:使用反射測試安卓裝置是否使用“動態桌布”安卓優化反射
- java反射之動態代理學習筆記Java反射筆記
- PHP 物件導向 (十一)反射類PHP物件反射
- 反射--Class物件功能--獲取Method反射物件
- Python物件導向之九:反射Python物件反射
- Java學習:反射的應用,依賴載入Java反射
- guava反射:Reflection.newProxy方法簡化動態代理Guava反射
- 深入探究 Golang 反射:功能與原理及應用Golang反射
- web中,利用反射給物件賦值Web反射物件賦值
- Java反射—初探反射基礎Java反射
- java 反射之操作靜態MethodJava反射
- .Net 中的反射(反射特性) - Part.3反射
- 使用ImpromptuInterface反射庫方便的建立自定義DfaGraphWriterUI反射
- 反射反射
- Python的反射Python反射
- Java的反射Java反射
- 反射,註解,動態代理,依賴注入控制反轉反射依賴注入
- Java反射與hook混用反射某支付的方法Java反射Hook