自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳解reflectJava的反射機制

開發(fā) 后端
Java中,反射是一種強大的工具。它使您能夠創(chuàng)建靈活的代碼,這些代碼可以在運行時裝配,無需在組件之間進行源代表鏈接。本文主要介紹的是reflectJava的反射機制,一起來看。

ReflectionJava 程序開發(fā)語言的特征之一,它允許運行中的 Java 程序對自身進行檢查,或者說“自審”,并能直接操作程序的內部屬性。Java 的這一能力在實際應用中也許用得不是很多,但是在其它的程序設計語言中根本就不存在這一特性。 

一、類型識別的兩種方式:

首先了解一下“運行時類型識別”(Run-time Type Identification, RTTI)主要有兩種方式,

***種:是我們在一次編譯時和運行時已經知道了所有的類型。

第二種:是我們在整項目分模塊的編譯,在運行時可以對新加入的模塊進行動態(tài)的編譯。(在動態(tài)編譯模塊之前還不知道被編譯code的類型。) 這就是下面要接受的,功能強大的“反射”機制。

二、認識“Class對象”:

要理解RTTI(運行時類型識別)在Java中的工作原理,首先必須知道類型信息在運行時是如何表示的,這項工作是由“Class對象”完成的,它包含了與類有關的信息。

類是程序的重要組成部分(類的屬性,方法以及它的一些特性,在這里我就不做贅述了。),每個類都有一個Class對象,每當編寫并編譯了一個新類就會產生一個Class對象,它被保存在一個與你所創(chuàng)建的新類同名的.class文件中。那么在程序運行時,當我們想生成這個類的對象時(實例化這個類),運行這個程序的Java虛擬機(JVM)就會這樣做:

首先會從加載所創(chuàng)新類的.class文件,

然后確認這個新類的Class對象是否已經加載,如果尚未加載,JVM就會根據(jù)類名查找.class文件,并將其載入,一旦這個類的Class對象被載入內存,它就被用來創(chuàng)建這個類的所有對象。

一般的RTTI形式包括三種:

1.傳統(tǒng)的類型轉換。如“(Apple)Fruit”,由RTTI確保類型轉換的正確性,如果執(zhí)行了一個錯誤的類型轉換,就會拋出一個ClassCastException異常。

2.通過Class對象來獲取對象的類型。如
[code="java"] Class c = Class.forName(“Apple”);
Object o = c.newInstance();

3.通過關鍵字instanceof或Class.isInstance()方法來確定對象是否屬于某個特定類型的實例,準確的說,應該是instanceof / Class.isInstance()可以用來確定對象是否屬于某個特定類及其所有基類的實例,這和equals() / ==不一樣,它們用來比較兩個對象是否屬于同一個類的實例,沒有考慮繼承關系。[enxtpage]

三、反射

如果不知道某個對象的類型,可以通過RTTI來獲取,但前提是這個類型在編譯時必須已知,這樣才能使用RTTI來識別。即在編譯時,編譯器必須知道所有通過RTTI來處理的類。

使用反射機制可以不受這個限制,它主要應用于兩種情況:

***種情況,是“基于構件的編程”這種編程方式中,將使用某種基于快速應用開發(fā)(RAD)的應用構建工具來構建項目。這是現(xiàn)在最常見的可視化編程方法,通過代表不同組件的圖標拖動到圖板上,然后設置”構件“(組件)的屬性值來配置它們來創(chuàng)建程序。

要做到這種配置編程,就必須要求構件都是可實例化的,并且要暴露其部分信息,使得程序員可以讀取和設置構件的值和狀態(tài)。當處理GUI時間的構件時還必須暴露相關方法的事件處理細節(jié),以便RAD環(huán)境幫助程序員覆蓋這些處理事件的方法。在這里,就要用到反射的機制來檢查可用的方法并返回方法實體對象。Java通過JavaBeans提供了基于構件的編程架構。

第二種情況,在運行時獲取類的信息的另外一個動機,就是希望能夠提供在跨網(wǎng)絡的遠程平臺上創(chuàng)建和運行對象的能力。這被成為遠程調用(RMI),它允許一個Java程序將對象分步在多臺機器上,這種分步能力將幫助開發(fā)人員執(zhí)行一些需要進行大量計算的任務,充分利用計算機資源,提高運行速度。

Class類支持反射,是在java.lang.reflect中包含了Field/Method/Constructor類,每個類都實現(xiàn)了Member接口。這些類型的對象都是由JVM在運行時創(chuàng)建的,用來表示未知類里對應的成員。如可以用Constructor類創(chuàng)建新的對象,用get()和set()方法讀取和修改與Field對象關聯(lián)的字段,用invoke()方法調用與Method對象關聯(lián)的方法。

同時,還可以調用getFields()、getMethods()、getConstructors()等方法來返回表示字段、方法以及構造器的對象數(shù)組。這樣,未知的對象的類信息在運行時就能被完全確定下來,而在編譯時不需要知道任何信息。

另外,RTTI有時能解決效率問題。當程序中使用多態(tài)給程序的運行帶來負擔的時候,可以使用RTTI編寫一段代碼來提高效率。

【編輯推薦】

  1. Java開發(fā)中類隱藏及應用場景分析
  2. Java開發(fā)者需要注意的十條法則
  3. 常見的十四種Java開發(fā)工具的特點
  4. Javascript中閉包的作用域鏈
  5. 新手入門JavaWeb三層架構的配置詳解
責任編輯:于鐵 來源: 考試大
相關推薦

2011-04-01 14:50:56

Java的反射機制

2011-09-27 10:23:24

Java反射機制

2011-03-09 09:11:52

java反射機制

2010-08-11 09:40:44

LINQ

2010-02-04 11:23:25

C++反射機制

2009-04-10 09:55:44

C#反射.NET

2012-04-05 13:50:38

Java

2017-03-24 09:44:33

Java反射機制

2017-05-17 15:28:15

Java反射機制

2023-11-01 13:48:00

反射java

2011-06-08 10:06:32

C#

2022-10-21 14:12:06

2009-06-17 13:57:54

java實例Reflection

2009-09-03 11:00:29

C#反射機制

2009-09-23 16:30:01

Hibernate f

2020-04-24 15:44:50

MySQL數(shù)據(jù)庫鎖機制

2016-12-26 13:46:25

Java反射機制總結

2009-10-13 09:05:45

反射機制

2009-02-03 09:42:53

JAVA類JVM指令forName方法

2023-06-27 08:37:35

Java反射動態(tài)代理機制
點贊
收藏

51CTO技術棧公眾號