Java反射之Constructor(一)
什麼是反射?要弄清楚反射,我們必須弄清楚什麼是位元組碼,什麼是類裝載器。我們知道,Java是一個完全面向物件的語言,
那麼我們寫好的 .java 檔案經過編譯後生成的 .class ,對Java虛擬機器來說,是不是應該也是一個物件呢?在Java中,的確是將
.class 看做一類物件,既然是一類物件,這些物件有哪些共性(共同的屬性和方法),是不是需要用一個Java類封裝起來呢?
是的。在Java中使用了 Class 這個Java類去封裝 .class 這一類物件(要注意Class 與 java中定義一個類的關鍵字 class 區分開來)。
明白了這一點,我們是不是應該想想 Class 這個Java類會封裝一些什麼資訊呢?這樣一問,我們是不是應該去問 .class 這一類物件
有哪些共性呢?我們平時定義一個普通Java類是不是有構造方法,成員變數(欄位屬性),成員方法等等共有的資訊啊。由此,我們可以
知道 Class 這個Java會封裝方法,欄位,構造方法等等共有特性。
總的來說,反射就是把我們寫的普通Java類中的各種成分對映成對應的Java類。如普通的Java類都有方法,構造方法和欄位等成分,那麼
Java中就會有Method,Constructor以及Field 和這些成分一一對應。
那麼,什麼是類裝載器呢?簡單的說,就有把 .class 載入到記憶體中的一個Java類。Java中好有些類裝載器類,Java虛擬就可以例項化這些類裝載器,
讓這些類裝載器為虛擬機器工作。既然是有類裝載器控制載入 .class 的,那麼我們是不是可以想,如果我們需要知道 .class 的一些資訊,是不是問問類裝載器
就可以獲取了呢!的確也是如此!
下面,就讓我們開始反射技術之旅吧!!!enjoy!!!
下面通過反射技術例項化一個類:
這是一個實體bean
package three.day.reflect;
public class Teacher {
private String name;
public Integer age;
public Teacher(){
System.out.println("empty constructor invoked");
}
public Teacher(String name,Integer age){
this.name = name;
this.age = age;
System.out.println("Str Int constructor invoked" + " , " +
"name = " + this.name + " , age = " + this.age);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Teacher [name=" + name + ", age=" + age + "]";
}
}
我們通過反射例項化這個bean類:
package three.day.reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class ReflectPerson {
public static void main(String[] args)
throws ClassNotFoundException, SecurityException, NoSuchMethodException,
IllegalArgumentException, InstantiationException, IllegalAccessException,
InvocationTargetException {
ClassLoader classLoader = ReflectPerson.class.getClassLoader();
System.out.println("1 classLoader = " + classLoader);
classLoader = Class.class.getClassLoader();
System.out.println("2 classLoader = " + classLoader);
classLoader = new ReflectPerson().getClass().getClassLoader();
System.out.println("3 classLoader = " + classLoader);
Class clazz = classLoader.loadClass("three.day.reflect.Teacher");
System.out.println("4 clazz = " + clazz);
clazz = Class.forName("three.day.reflect.Teacher");
System.out.println("5 clazz = " + clazz);
Constructor[] constructors = clazz.getConstructors();
int i = 6;
for(Constructor c : constructors){
System.out.println(i + " " + c);
i++;
}
Constructor cttEmpty = clazz.getConstructor(new Class[]{});
Object objEmpty = cttEmpty.newInstance(new Object[]{});
Constructor cttParamsStrInt = clazz.getConstructor(new Class[]{String.class,Integer.class});
Object objPramsStrint = cttParamsStrInt.newInstance(new Object[]{"lihuiming",45});
}
}
程式執行效果:
1 classLoader = [email protected]
2 classLoader = null
3 classLoader = [email protected]
4 clazz = class three.day.reflect.Teacher
5 clazz = class three.day.reflect.Teacher
6 public three.day.reflect.Teacher()
7 public three.day.reflect.Teacher(java.lang.String,java.lang.Integer)
empty constructor invoked
8 objEmpty = Teacher [name=null, age=null]
Str Int constructor invoked , name = lihuiming , age = 45
9 objPramsStrint = Teacher [name=lihuiming, age=45]
通過觀察結果:
我們知道,的確已經例項化了bean,但是
我們是不是該問下 Class 這個類是沒有對應的類裝載器的?
有興趣的同志可以探討一下,遲些我也會聊聊類裝載器這個知識點。
相關推薦
Java反射之Constructor(一)
什麼是反射?要弄清楚反射,我們必須弄清楚什麼是位元組碼,什麼是類裝載器。我們知道,Java是一個完全面向物件的語言, 那麼我們寫好的 .java 檔案經過編譯後生成的 .class ,對Java虛擬機器來說,是不是應該也是一個物件呢?在Java中,的確是將 .class
Java 系列之Filter(一)
_id java ted img 3.2 認證 nts index.jsp enc 一、過濾器 過濾器就是在源數據和目的數據之間起過濾作用的中間組件。它可以截取客戶端和資源之間的請求和響應信息,並且對這些信息進行過濾。 二、應用場景 1、對用戶請求進行統一認證
java基礎之--註解(一)
最近學習spring5的時候,發現好像多了一些新的註解,於是乎想好好看看這些註解到底是怎麼實現的,但是奈何自己連基礎的元註解都還是一知半解,所以還是萬丈高樓平地起,一切以基礎為重。下面就來說說jdk自帶的元註解,與新手朋友們分享也為自己填一個坑。 1.什麼是元
JAVA反射之 Field (屬性)
主要方法: public static void main(String[] args) throws Exception { Class<?> clazz = Class.forName("Person"); //得到類中所有方法,返回一個數組
java框架之spring(一)
前言 Spring是一個基於IOC和AOP的結構J2EE系統的框架 ,IOC(Inversion Of Control )反轉控制是Spring的基礎,簡單說就是建立物件由以前的程式設計師自己new 構造方法來呼叫,變成了交由Spring建立物件;DI (Dependen
elasticsearch-java api之搜尋(一)
1、全文搜尋兩個最重要的方面是: 1)相關性(Relevance) 它是評價查詢與其結果間的相關程度,並根據這種相關程度對結果排名的一種能力,這種計算方式可以是 TF/IDF 方法(參見 相關性的介紹)、地理位置鄰近、模糊相似,或其他的某些演算法。 2)分析(Analysi
JavaSE_8系列部落格——專家之路(一)---Java反射的總結
先來四個基本問題 一什麼是反射what 生活中的反射 程式設計語言中的反射 Java中的反射 其他語言中的反射 NET平臺中的反射
Java面向對象編程之繼承(一)
col end 分情況討論 讓我 重要 san 封裝 pub void 前言 Java語言有三大重要的特性,分別是繼承、多態和封裝。今天我們就來聊聊繼承,繼承是復用程序代碼的有力手段,使用繼承我們會少寫許多代碼,也可以讓我們在寫代碼的時候邏輯變得更加清楚。 繼承的基本語法
java集合類源碼分析之List(一)
col 實現類 並且 link arraylist oar print 適用於 for 首先分析一下集合與數組的區別:1.java中的數組一般用於存儲基本數據類型,而且是靜態的,即長度固定不變,這就不適用於元素個數未知的情況;2.集合只能用於存儲引用類型,並且長度可變,
JAVA線程池 之 Executors (一)
i++ static 順序 nta executors 情況下 線程的生命周期 有一個 ping 一、背景 線程屬於系統稀缺資源,在使用線程時,如果無限制創建線程,達到CPU高負荷時,會導致系統運行緩慢,更有甚者直接宕機。 在這樣的基礎上我們希望在使用線程時,竟可能使系
幹貨:Java並發編程系列之volatile(一)
並發編程 程序員 Java 架構 volatil Java語言規範第三版中對volatile的定義如下:Java編程語言允許線程訪問共享變量,為了確保共享變量能被準確和一致地更新,線程應該確保通過排他鎖單獨獲得這個變量。了解volatile關鍵字之前需要先了解下Java內存模型,java內
JAVA基礎學習之路(一)
個人理解 整形 之路 boolean mman 類型 布爾 屬性 註釋 JAVA基礎概念: PATHl: path屬於操作系統的屬性,是系統用來搜尋可執行文件的路徑,個人理解是類似於linux中的全局變量 CALSSPATH:java程序解釋類文件時加載文件的路徑 註釋
dotNet程序員的Java爬坑之旅(一)
是我 方法 轉java 自己的 java pri 也好 工作 計劃 仔細想了下還是轉java吧,因為後期不管是留在北京也好還是回老家也好,java的工作都會好找一點。現在的工作主要還是寫.net,目標是下一次離職的時候可以找到一份全職的java工作,我一直都覺得實踐
java筆記IO流(一)之位元組流
1.概念 * IO流用來處理裝置之間的資料傳輸 * Java對資料的操作是通過流的方式 * Java用於操作流的類都在IO包中
Java小白進階之路(一)
1、字串操作:replace方法(舊字串,新子串)。 Scanner scanner = new Scanner(System.in); System.out.println("請輸入"); // 接收使用者的輸入的字串 String s1 = scanner.next(); // 接受整型 i
PKI學習之路(一)------------------------java實現簡單的socket通訊
專案地址:https://github.com/gongxianshengjiadexiaohuihui/PKI 關於什麼是socket通訊,我會寫一篇部落格去敘述 這次我們主要實現client和server通過socket進行通訊 server程式碼 package com.ggp
行java之道(一)學習的方法
行java之道(一)學習的心得 自序 我是一名普通的JAVA開發從業者,接下來一段時間我會更新一些自己的心得體會,之所以想要這麼做,一是因為自己早有將自己的心得體會記錄下來的願景;二是因為自己在近來招聘中所遇見的應聘者誇誇其談框架,卻對基礎答非所問
Java整合Sentry之配置(一)
Sentry的庫和框架整合文件說明了如何為每個受支援的整合執行初始Sentry配置。通過整合設定Sentry後,以下配置可與任何整合結合使用。在嘗試進行任何高階配置之前,請檢查整合文件。 一、設定DSN DSN是第一個也是最重要的配置,因為它告訴SDK在哪裡傳送事件。您可
java原始碼剖析之socket(一)
不知不覺又到了新的的一週,時間在悄悄的溜走,所辛的是自己也在緩慢的推進著自己的學習計劃。 這周按照計劃檢視的是socket系列的相關類,儘管這之前就已經看過一遍,不過當時是越看越蒙,完全找不到北。 隨著自己能力的提升,回過頭來又去看一遍,還是看不懂其中的精
Java架構師之旅(一)
夜光序言: 如果世界和你,都掉進了河裡,我一定先救你,然後忘記世界的呼吸~ 正文: MVC框架的演變 我們安裝這個外掛解決沒有tomcat的問題,因為targ