中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中反射機制的原理

發布時間:2021-05-11 15:30:39 來源:億速云 閱讀:126 作者:Leah 欄目:編程語言

Java中反射機制的原理?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

Java的優點是什么

1. 簡單,只需理解基本的概念,就可以編寫適合于各種情況的應用程序;2. 面向對象;3. 分布性,Java是面向網絡的語言;4. 魯棒性,java提供自動垃圾收集來進行內存管理,防止程序員在管理內存時容易產生的錯誤。;5. 安全性,用于網絡、分布環境下的Java必須防止病毒的入侵。6. 體系結構中立,只要安裝了Java運行時系統,就可在任意處理器上運行。7. 可移植性,Java可以方便地移植到網絡上的不同機器。8.解釋執行,Java解釋器直接對Java字節碼進行解釋執行。

Java 反射機制

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

Java反射機制提供的功能

  • 在運行時判斷任意一個對象所屬的類

  • 在運行時構造任意一個類的對象

  • 在運行時判斷任意一個類所具有的成員變量和方法

  • 在運行時調用任意一個對象的成員變量和方法

  • 生成動態代理

反射相關的主要API:

  • java.lang.Class:代表一個類

  • java.lang.reflect.Method:代表類的方法

  • java.lang.reflect.Field:代表類的成員變量

  • java.lang.reflect.Constructor:代表類的構造方法

Class類

  • 對照鏡子后可以得到的信息:某個類的屬性、方法和構造器、某個類到底實現了哪些接口。對于每個類而言,JRE 都為其保留一個不變的 Class類型的對象。一個 Class對象包含了特定某個類的有關信息。

  • Class本身也是一個類

  • Class對象只能由系統建立對象

  • 一個類在JVM 中只會有一個Class實例

  • 一個Class對象對應的是一個加載到JVM中的一個.class文件

  • 每個類的實例都會記得自己是由哪個Class 實例所生成

  • 通過Class可以完整地得到一個類中的完整結構

實例化Class類對象

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

實例:

Class clazz = String.class;

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

實例:

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

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

實例:

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

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

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

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

創建類對象并獲取類的完整結構

1.創建類的對象:調用Class對象的newInstance()方法

要求:

1)類必須有一個無參數的構造器。

2)類的構造器的訪問權限需要足夠。

難道沒有無參的構造器就不能創建對象了嗎?

不是!只要在操作的時候明確的調用類中的構造方法,并將參數傳遞進去之后,才可以實例化操作。步驟如下:

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

2)向構造器的形參中傳遞一個對象數組進去,里面包含了構造器中所需的各個參數。

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

通過反射調用類的完整結構

使用反射可以取得:

1.實現的全部接口

public Class

通過反射調用類中的指定方法、指定屬性

1.調用指定方法

通過反射,調用類中的方法,通過Method類完成。步驟:

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

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

Object invoke(Object obj, Object … args)

說明:

1.Object 對應原方法的返回值,若原方法無返回值,此時返回null

2.若原方法若為靜態方法,此時形參Objectobj可為null

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

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

2.調用指定屬性

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

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

在Field中:

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

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

Java動態代理

1、動態代理是指客戶通過代理類來調用其它對象的方法,并且是在程序運行時根據需要動態創建目標類的代理對象。

2、動態代理使用場合:

  • 調試

  • 遠程方法調用

3、代理設計模式的原理:

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

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

5、提供用于創建動態代理類和動態代理對象的靜態方法

static Class

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南丰县| 镇坪县| 定南县| 巴中市| 南宫市| 开鲁县| 金川县| 建阳市| 嘉义市| 淮阳县| 西乌| 武陟县| 翼城县| 永州市| 鄂尔多斯市| 韩城市| 福安市| 洞口县| 武威市| 布尔津县| 金寨县| 邻水| 梁河县| 汉源县| 九龙县| 宝丰县| 义马市| 原阳县| 上林县| 福安市| 军事| 古浪县| 紫金县| 成武县| 于都县| 泰兴市| 乌兰察布市| 湘西| 长寿区| 敖汉旗| 凯里市|