淺談Java反射

一、動態語言

動態語言,是指程序在運行時可以改變其結構:新的函數可以被引進,就的函數可以被修改刪除等結構上的變化。比如常見的javascript、python等屬於動態語言,而c、c++不屬於動態語言。從反射角度來說,Java屬於半動態語言。

二、反射機制概念(反射過程中知道類的所有屬性和方法)在這裏插入圖片描述

在Java語言中反射機制是指在運行狀態中,對於任意一個類都能夠知道這個類所有的屬性和方法;對於任意一個對象,都能夠調用他的任意一個方法。這種動態獲取信息動態調用對象方法的功能成爲Java語言的反射機制。

三、反射的應用場景

3.1編譯時類型和運行時類型

在Java中許多對象在運行時都會出現兩種類型:編譯時類型和運行時類型。編譯類型由聲明對象時聲明類型決定,聲明時類型由實際賦值類型決定。如:

	Person person = new Man();

其中編譯時類型爲person,運行時類型爲Man。

3.2編譯時類型無法獲取具體方法

程序在運行時還可能接收到外部傳入的對象,該對象編譯時類型爲object,但是程序有需要調用該對象運行時的方法,爲了解決這些問題,程序在運行時需要發現類和對象的真實信息,然而,在編譯時如果根本無法知道對象和類屬於哪些類,程序只能依靠運行時信息獲取類和對象的真實信息。此時就必須使用Java反射機制。

四、Java反射API

反射API用來jvm中的類、接口或者對象信息;。

  1. Class類:反射的核心類,可以獲取類的屬性、方法等信息;
  2. Field類:Java.lang.reflec包中的類,表示類的成員變量,可以用來獲取、設置類中的屬性值;
  3. Method類:Java.lang.reflec包中的類,表示類的方法,可以用來獲取和執行類中的方法;
  4. Constructor: Java.lang.reflec包中的類,表示類的構造方法。

五、反射使用步驟(獲取Class對象,使用對象方法)

  1. 獲取想要操作類的Class對象,反射的核心,通過Class對象可以任意調用類的方法;
  2. 調用Class類中的方法,class類的使用階段;
  3. 使用反射API來操作這些信息。

六、獲取Class對象的三種方法

調用某個對象的getClass()方法

Person person = new Person();
Class clazz = person.getClass();

調用某個類的class屬性,來獲取對應類的class對象

Class clazz = Person.class;

使用Class類中的forName()靜態方法(最安全/性能最好)

Class clazz = Class.forName("類的全路徑");//最常用

當我們獲得了想要的class對象後,可以通過Class類中的方法獲取和查看對象中的屬性和方法。

//獲取Person類中的屬性和方法
Class clazz=Class.forName("reflection.Person");
//獲取Person類中的所有方法
Method[] methods = clazz.getDeclaredMethods();
for(Method method:methods){
	System.out.println(m.toSting());
}
//獲取Person類的所有成員屬性信息
Field[] field=clazz.getDeclaredFields();
for(Field f:field){
	System.out.println(f.toString());
}
//獲取Person類的所有構造方法信息
Constructor[] constructor=clazz.getDeclaredConstructors();
for(Constructor c:constructor){
	System.out.println(c.toString());
}

七、創建對象的兩種方法

7.1Class對象的newInstance()

使用Class對象的newInstance()方法來獲取Class對象對應的實例,但是這種方法要求Class對象對應的類有默認的空參構造;

7.2Constructor方法的newInstance()

先使用Class對象獲取指定的Constructor對象,再調用Constructor對象的newInstance()方法來創建Class對象對應類的實例,通過這種方法可以選定構造方法創建實例。

//獲取Person類的Class對象
Class clazz=Class.forName("reflection.Person"); 
//使用.newInstane方法創建對象
Person p=(Person) clazz.newInstance();
//獲取構造方法並創建對象
Constructor c=clazz.getDeclaredConstructor(String.class,String.class,int.class);
//創建對象並設置屬性
Person p1=(Person) c.newInstance("李四","男",20);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章