亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java 反射機(jī)制原理與用法詳解

 更新時間:2019年12月07日 11:14:32   作者:code_designer  
這篇文章主要介紹了Java 反射機(jī)制原理與用法,結(jié)合實(shí)例形式詳細(xì)分析了java反射機(jī)制的相關(guān)概念、原理、使用方法及操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了Java 反射機(jī)制原理與用法。分享給大家供大家參考,具體如下:

Java 反射機(jī)制

Reflection(反射)是被視為動態(tài)語言的關(guān)鍵,反射機(jī)制允許程序在執(zhí)行期借助于Reflection
API取得任何類的內(nèi)部信息,并能直接操作任意對象的內(nèi)部屬性及方法。

Java反射機(jī)制提供的功能

  • 在運(yùn)行時判斷任意一個對象所屬的類
  • 在運(yùn)行時構(gòu)造任意一個類的對象
  • 在運(yùn)行時判斷任意一個類所具有的成員變量和方法
  • 在運(yùn)行時調(diào)用任意一個對象的成員變量和方法
  • 生成動態(tài)代理

反射相關(guān)的主要API:

  • java.lang.Class:代表一個類
  • java.lang.reflect.Method:代表類的方法
  • java.lang.reflect.Field:代表類的成員變量
  • java.lang.reflect.Constructor:代表類的構(gòu)造方法

Class類

  • 對照鏡子后可以得到的信息:某個類的屬性、方法和構(gòu)造器、某個類到底實(shí)現(xiàn)了哪些接口。對于每個類而言,JRE 都為其保留一個不變的 Class類型的對象。一個 Class對象包含了特定某個類的有關(guān)信息。
  • Class本身也是一個類
  • Class對象只能由系統(tǒng)建立對象
  • 一個類在JVM 中只會有一個Class實(shí)例
  • 一個Class對象對應(yīng)的是一個加載到JVM中的一個.class文件
  • 每個類的實(shí)例都會記得自己是由哪個Class 實(shí)例所生成
  • 通過Class可以完整地得到一個類中的完整結(jié)構(gòu)

實(shí)例化Class類對象

1、前提:若已知具體的類,通過類的class屬性獲取,該方法最為安全可靠,程序性能最高

​ 實(shí)例:

Class clazz = String.class;

2、前提:已知某個類的實(shí)例,調(diào)用該實(shí)例的getClass()方法獲取Class對象

​ 實(shí)例:

Class clazz ="www.atguigu.com".getClass();

3、前提:已知一個類的全類名,且該類在類路徑下,可通過Class類的靜態(tài)方法forName()獲取,可能拋出
ClassNotFoundException

​ 實(shí)例:

Classclazz= Class.forName("java.lang.String");

4、其他方式(不做要求)

ClassLoader cl =this.getClass().getClassLoader();

Classclazz4 = cl.loadClass("類的全類名");

創(chuàng)建類對象并獲取類的完整結(jié)構(gòu)

1.創(chuàng)建類的對象:調(diào)用Class對象的newInstance()方法

要求:

1)類必須有一個無參數(shù)的構(gòu)造器。

2)類的構(gòu)造器的訪問權(quán)限需要足夠。

難道沒有無參的構(gòu)造器就不能創(chuàng)建對象了嗎?

不是!只要在操作的時候明確的調(diào)用類中的構(gòu)造方法,并將參數(shù)傳遞進(jìn)去之后,才可以實(shí)例化操作。步驟如下:

1)通過Class類的getDeclaredConstructor(Class …parameterTypes)取得本類的指定形參類型的構(gòu)造器

2)向構(gòu)造器的形參中傳遞一個對象數(shù)組進(jìn)去,里面包含了構(gòu)造器中所需的各個參數(shù)。

//1.根據(jù)全類名獲取對應(yīng)的Class對象
String name = "atguigu.java.Person";
Class clazz = null;
clazz = Class.forName(name);
//2.調(diào)用指定參數(shù)結(jié)構(gòu)的構(gòu)造器,生成Constructor的實(shí)例
Constructor con = clazz.getConstructor(String.class,Integer.class);
//3.通過Constructor的實(shí)例創(chuàng)建對應(yīng)類的對象,并初始化類屬性
Person p2 = (Person)  con.newInstance("Peter",20);
System.out.println(p2);

通過反射調(diào)用類的完整結(jié)構(gòu)

使用反射可以取得:

1.實(shí)現(xiàn)的全部接口

public Class

通過反射調(diào)用類中的指定方法、指定屬性

1.調(diào)用指定方法

通過反射,調(diào)用類中的方法,通過Method類完成。步驟:

1.通過Class類的getMethod(String name,Class…parameterTypes)方法取得一個Method對象,并設(shè)置此方法操作時所需要的參數(shù)類型。

2.之后使用Object invoke(Object obj, Object[] args)進(jìn)行調(diào)用,并向方法中傳遞要設(shè)置的obj對象的參數(shù)信息。

Object invoke(Object obj, Object … args)

說明:

​ 1.Object 對應(yīng)原方法的返回值,若原方法無返回值,此時返回null

​ 2.若原方法若為靜態(tài)方法,此時形參Objectobj可為null

​ 3.若原方法形參列表為空,則Object[]args為null

​ 4.若原方法聲明為private,則需要在調(diào)用此invoke()方法前,顯式調(diào)用方法對象的 setAccessible(true)方法,將可訪問private的方法。

2.調(diào)用指定屬性

在反射機(jī)制中,可以直接通過Field類操作類中的屬性,通過Field類提供的set()和get()方法就可以完成設(shè)置和取得屬性內(nèi)容的操作。

public Field getField(Stringname) 返回此Class對象表示的類或接口的指定的public的Field。
public Field getDeclaredField(Stringname)返回此Class對象表示的類或接口的指定的Field。

在Field中:

public Object get(Object obj)取得指定對象obj上此Field的屬性內(nèi)容
public void set(Object obj,Objectvalue) 設(shè)置指定對象obj上此Field的屬性內(nèi)容

注:在類中屬性都設(shè)置為private的前提下,在使用set()和get()方法時,首先要使用Field類中的setAccessible(true)方法將需要操作的屬性設(shè)置為可以被外部訪問。
public void setAccessible(true)訪問私有屬性時,讓這個屬性可見。

Java動態(tài)代理

1、動態(tài)代理是指客戶通過代理類來調(diào)用其它對象的方法,并且是在程序運(yùn)行時根據(jù)需要動態(tài)創(chuàng)建目標(biāo)類的代理對象。

2、動態(tài)代理使用場合:

  • 調(diào)試
  • 遠(yuǎn)程方法調(diào)用

3、代理設(shè)計(jì)模式的原理:

  • 使用一個代理將對象包裝起來, 然后用該代理對象取代原始對象. 任何對原始對象的調(diào)用都要通過代理. 代理對象決定是否以及何時將方法調(diào)用轉(zhuǎn)到原始對象上

4、Proxy :專門完成代理的操作類,是所有動態(tài)代理類的父類。通過此類為一個或多個接口動態(tài)地生成實(shí)現(xiàn)類。

5、提供用于創(chuàng)建動態(tài)代理類和動態(tài)代理對象的靜態(tài)方法

static Class

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計(jì)入門與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

最新評論