成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解reflectJava的反射機(jī)制

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

ReflectionJava 程序開(kāi)發(fā)語(yǔ)言的特征之一,它允許運(yùn)行中的 Java 程序?qū)ψ陨磉M(jìn)行檢查,或者說(shuō)“自審”,并能直接操作程序的內(nèi)部屬性。Java 的這一能力在實(shí)際應(yīng)用中也許用得不是很多,但是在其它的程序設(shè)計(jì)語(yǔ)言中根本就不存在這一特性。 

一、類(lèi)型識(shí)別的兩種方式:

首先了解一下“運(yùn)行時(shí)類(lèi)型識(shí)別”(Run-time Type Identification, RTTI)主要有兩種方式,

***種:是我們?cè)谝淮尉幾g時(shí)和運(yùn)行時(shí)已經(jīng)知道了所有的類(lèi)型。

第二種:是我們?cè)谡?xiàng)目分模塊的編譯,在運(yùn)行時(shí)可以對(duì)新加入的模塊進(jìn)行動(dòng)態(tài)的編譯。(在動(dòng)態(tài)編譯模塊之前還不知道被編譯code的類(lèi)型。) 這就是下面要接受的,功能強(qiáng)大的“反射”機(jī)制。

二、認(rèn)識(shí)“Class對(duì)象”:

要理解RTTI(運(yùn)行時(shí)類(lèi)型識(shí)別)在Java中的工作原理,首先必須知道類(lèi)型信息在運(yùn)行時(shí)是如何表示的,這項(xiàng)工作是由“Class對(duì)象”完成的,它包含了與類(lèi)有關(guān)的信息。

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

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

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

一般的RTTI形式包括三種:

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

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

3.通過(guò)關(guān)鍵字instanceof或Class.isInstance()方法來(lái)確定對(duì)象是否屬于某個(gè)特定類(lèi)型的實(shí)例,準(zhǔn)確的說(shuō),應(yīng)該是instanceof / Class.isInstance()可以用來(lái)確定對(duì)象是否屬于某個(gè)特定類(lèi)及其所有基類(lèi)的實(shí)例,這和equals() / ==不一樣,它們用來(lái)比較兩個(gè)對(duì)象是否屬于同一個(gè)類(lèi)的實(shí)例,沒(méi)有考慮繼承關(guān)系。[enxtpage]

三、反射

如果不知道某個(gè)對(duì)象的類(lèi)型,可以通過(guò)RTTI來(lái)獲取,但前提是這個(gè)類(lèi)型在編譯時(shí)必須已知,這樣才能使用RTTI來(lái)識(shí)別。即在編譯時(shí),編譯器必須知道所有通過(guò)RTTI來(lái)處理的類(lèi)。

使用反射機(jī)制可以不受這個(gè)限制,它主要應(yīng)用于兩種情況:

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

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

第二種情況,在運(yùn)行時(shí)獲取類(lèi)的信息的另外一個(gè)動(dòng)機(jī),就是希望能夠提供在跨網(wǎng)絡(luò)的遠(yuǎn)程平臺(tái)上創(chuàng)建和運(yùn)行對(duì)象的能力。這被成為遠(yuǎn)程調(diào)用(RMI),它允許一個(gè)Java程序?qū)?duì)象分步在多臺(tái)機(jī)器上,這種分步能力將幫助開(kāi)發(fā)人員執(zhí)行一些需要進(jìn)行大量計(jì)算的任務(wù),充分利用計(jì)算機(jī)資源,提高運(yùn)行速度。

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

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

另外,RTTI有時(shí)能解決效率問(wèn)題。當(dāng)程序中使用多態(tài)給程序的運(yùn)行帶來(lái)負(fù)擔(dān)的時(shí)候,可以使用RTTI編寫(xiě)一段代碼來(lái)提高效率。

【編輯推薦】

  1. Java開(kāi)發(fā)中類(lèi)隱藏及應(yīng)用場(chǎng)景分析
  2. Java開(kāi)發(fā)者需要注意的十條法則
  3. 常見(jiàn)的十四種Java開(kāi)發(fā)工具的特點(diǎn)
  4. Javascript中閉包的作用域鏈
  5. 新手入門(mén)JavaWeb三層架構(gòu)的配置詳解
責(zé)任編輯:于鐵 來(lái)源: 考試大
相關(guān)推薦

2011-04-01 14:50:56

Java的反射機(jī)制

2010-08-11 09:40:44

LINQ

2011-03-09 09:11:52

java反射機(jī)制

2011-09-27 10:23:24

Java反射機(jī)制

2010-02-04 11:23:25

C++反射機(jī)制

2009-04-10 09:55:44

C#反射.NET

2012-04-05 13:50:38

Java

2017-03-24 09:44:33

Java反射機(jī)制

2017-05-17 15:28:15

Java反射機(jī)制

2023-11-01 13:48:00

反射java

2011-06-08 10:06:32

C#

2022-10-21 14:12:06

2020-04-24 15:44:50

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

2009-09-23 16:30:01

Hibernate f

2009-06-17 13:57:54

java實(shí)例Reflection

2009-09-03 11:00:29

C#反射機(jī)制

2009-02-03 09:42:53

JAVA類(lèi)JVM指令forName方法

2016-12-26 13:46:25

Java反射機(jī)制總結(jié)

2009-10-13 09:05:45

反射機(jī)制

2021-02-23 08:18:04

Java 反射機(jī)制
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 丁香婷婷成人 | 一级片网址 | www.天堂av.com | 亚洲精品第一 | 亚洲一区二区三区在线 | 一级片aaa| 亚洲高清在线 | 中文字幕精品一区 | 日本久久一区 | 久久精品小视频 | 亚洲精品资源 | 国产精品成人一区二区三区夜夜夜 | 亚洲精品久久 | 亚洲精品免费在线观看 | 爱爱小视频 | 久久久69| 国产在线高清 | 亚洲 91| 中文字幕在线观看一区 | 亚洲成人免费在线 | 亚洲电影一区二区三区 | 色桃网 | 超碰操| 最新国产精品视频 | 日韩精品极品视频在线观看免费 | 精品一区二区电影 | 91资源在线播放 | 亚洲码欧美码一区二区三区 | 国产一级片免费看 | 精品1区2区 | 精品国产区 | 久久久久久高清 | 亚洲国产成人精品久久久国产成人一区 | 精品伊人久久 | 91九色在线观看 | 久久这里只有精品首页 | 999精品网| 在线成人福利 | 日韩色在线| 美国一级毛片a | 亚洲精品视频免费观看 |