1. 程式人生 > >Java反射之Constructor(一)

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