成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

java反射的用途及實現(xiàn)

本篇內(nèi)容介紹了“java反射的用途及實現(xiàn)”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

專業(yè)領(lǐng)域包括成都網(wǎng)站設(shè)計、網(wǎng)站制作、購物商城網(wǎng)站建設(shè)、微信營銷、系統(tǒng)平臺開發(fā), 與其他網(wǎng)站設(shè)計及系統(tǒng)開發(fā)公司不同,創(chuàng)新互聯(lián)的整合解決方案結(jié)合了幫做網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗和互聯(lián)網(wǎng)整合營銷的理念,并將策略和執(zhí)行緊密結(jié)合,為客戶提供全網(wǎng)互聯(lián)網(wǎng)整合方案。

 

反射是什么?

反射是Java程序開發(fā)語言的特征之一,它允許動態(tài)地發(fā)現(xiàn)和綁定類、方法、字段,以及所有其他的由于有所產(chǎn)生的的元素。通過反射,能夠在需要時完成創(chuàng)建實例、調(diào)用方法和訪問字段的工作。

反射機制主要提供功能

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

  • 在運行時構(gòu)造任意一個類的對象

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

  • 在運行時調(diào)用任意一個對象的方法,通過反射甚至可以調(diào)用到private修飾的方法

  • 生成動態(tài)代理

反射在牛逼框架中的使用

  • Spring 框架的 IOC 基于反射創(chuàng)建對象和設(shè)置依賴屬性。

  • Spring MVC 的請求調(diào)用對應(yīng)方法,也是通過反射。

  • JDBC 的 Class#forName(String className) 方法,也是使用反射。

反射中,Class.forName 和 ClassLoader 區(qū)別?

這兩者,都可用來對類進(jìn)行加載。差別在于:

  • Class#forName(…) 方法,除了將類的 .class 文件加載到JVM 中之外,還會對類進(jìn)行解釋,執(zhí)行類中的 static 塊。

  • ClassLoader 只干一件事情,就是將 .class 文件加載到 JVM 中,不會執(zhí)行 static 中的內(nèi)容,只有在 newInstance  才會去執(zhí)行 static 塊。

反射的常用類

Java中反射相關(guān)的類大部分都在rt.jar下java.lang.reflect中,其實需要的類并不多,主要有以下幾個:

java.lang.Class

Class類的實例表示正在運行的Java類和接口。

java.lang.reflect.Field

提供有關(guān)類或者接口的屬性信息,以及對它的動態(tài)訪問權(quán)限。反射的字段可能是一個類(靜態(tài))屬性或?qū)嵗龑傩?,簡單的理解可以把它看成一個封裝反射類的屬性的類。有點繞,慢慢體會吧。

java.lang.reflect.Constructor

提供關(guān)于類的單個構(gòu)造方法的信息以及對它的訪問權(quán)限。這個類和Field類不同,F(xiàn)iled類封裝類反射類的屬性,而Constructor類則封裝類反射類的構(gòu)造方法。

java.lang.reflect.Method

提供關(guān)于類和接口上單個方法的信息。所反映的方法可能是類方法或者實例方法(包括抽象方法)。這個類不難理解,他的作用就是用來封裝反射類方法的一個類。

java.lang.reflect.Modifier

提供了用于解碼類和成員訪問修飾符的靜態(tài)方法和常量。修飾符集合被表示為具有表示不同修飾符的不同位位置的整數(shù)。

java.lang.reflect.Array

提供了動態(tài)創(chuàng)解決數(shù)組和訪問數(shù)組的靜態(tài)方法,該類中的所有方法都是靜態(tài)方法。

反射的優(yōu)缺點

優(yōu)點

  • 可以在程序運行的過程中,操作這些對象。

  • 可以解耦,提高程序的可擴展性。

缺點

  • 因為是JVM操作,所以對于性能來說會有所下降。

  • 容易對程序源碼造成一定的混亂。

探索 Class

java反射的用途及實現(xiàn)

java文件編譯后變成class文件,class文件被類加載器加載到內(nèi)存中,并且JVM根據(jù)其字節(jié)數(shù)組創(chuàng)建了對應(yīng)的Class對象。

Class類是Java反射的起源,針對任何一個我們想使用的類,只有先為它產(chǎn)生一個Class對象,接下來就可以通過Class對象獲取其他的信息。

JVM為每個類管理著一個獨一無二的Class對象,當(dāng)我們需要創(chuàng)建每個類的對象時,JVM會檢查所要加載的類對應(yīng)的Class對象是否已經(jīng)存在。不存在,則JVM會根據(jù)類加載機制加載并創(chuàng)建對應(yīng)的Class對象,最后使用Class對象創(chuàng)建出我們通常使用的實例對象。

獲取Class類的三種方式

1.調(diào)用Object類的getClass()方法獲得Class對象。

2.使用Class類的forName("com.tian.XXX")靜態(tài)方法獲取與字符串對應(yīng)的對象(類或接口的全限定名)。

3.使用.class獲取該類性的Class對象。

Class常用方法

java反射的用途及實現(xiàn)

java反射的用途及實現(xiàn)

方法非常之多。

獲取類信息

了解了Java反射的詳細(xì)細(xì)節(jié)之后,我們可以使用反射機制來獲取類中的信息。

java反射的用途及實現(xiàn)

創(chuàng)建對象

使用無參構(gòu)造方法創(chuàng)建對象

比如說下面這段代碼:

Class clazz = Class.forName("java.lang.String"); String str = (String)clazz.newInstance();

這里需要注意,這個類必須是有無參構(gòu)造方法,不然這種方式會報錯的。

使用有參構(gòu)造方法

可以使用三個步驟來完成:

1.獲取指定類對應(yīng)的Class對象

2.通過Class對象獲取滿足指定參數(shù)類型要求的構(gòu)造方法類對象

3.調(diào)用指定的Constructor對應(yīng)的newInstance方法,傳入對應(yīng)的參數(shù)值,創(chuàng)建出我們想要的實例對象。

Class clazz = Class.forName("java.lang.String"); Constructor constructor = clas.getConstructor(String.class); String str = (String)constructor.newInstance("hello world");

這樣就創(chuàng)建了一個String對象實例。

調(diào)用方法

前面已經(jīng)聊過Method這個類,我們可以通過Method類中的invoke方法動態(tài)調(diào)用器方法。

public final class Method extends Executable {     public Object invoke(Object obj, Object... args){     //....     } }

這個方法的第一個參數(shù)是一個對象類型,表示要在指定的這個對象上調(diào)用這個方法(方法名稱)。第二個參數(shù)是可變參數(shù),用來給這個方法傳遞參數(shù)值;

invoke方法里返回的值用來表示動態(tài)調(diào)用指定方法后的返回值。如果調(diào)用私有的方法,先調(diào)用setAccessible(true)來曲線Java語言堆笨方法的訪問檢查,然后再調(diào)用invoke方法來真正執(zhí)行這個私有方法。

訪問成員變量的值

使用反射可以獲取類的成員變量的對象代表,成員變量的對象代表是

java.lang.reflect.Field類的實例,可以使用他的getXyy()方法來獲取指定對象上的值,也可以使用setXyy()方法來動態(tài)修改指定對象上的值,其中xyy是成員變量。

比如說:setAge(22);其中age就是成員變量。

操作數(shù)組

數(shù)組也是一個度一項,可以通過反射來查看數(shù)組的各個屬性的信息,比如

ingt [] intArr=new Int[10]; Sysytem.out.prinlt("數(shù)組類型:"+intArr.getClass.getComponentType().getName());  Object obj=Array.newInstance(int.class, 10); //維數(shù)組賦值 for(int i=0;i<10;i++){     Array.setInt(obj,i,i); } for(int i = 0;i<10;i++){     System.out.print("第"+i+"好元素為"+Array.getInt(obj,i)); }

反射與動態(tài)代理

代理模式是Java中使用頻率相當(dāng)高的設(shè)計模式之一,尤其是在牛逼的框架中,Spring,Mybatis,Dubbo等框架中。

其中反射就是一個很好的應(yīng)用。

靜態(tài)代理模式我們就沒有必要提他了,相當(dāng)于一個業(yè)務(wù)需要代理,你就得給他搞一個代理類。全是手動搞出來的。

動態(tài)代理的原理就是,在程序運行時候根據(jù)需要動態(tài)地創(chuàng)建目標(biāo)類的代理對象,典型應(yīng)用場景:

  • JDK動態(tài)代理

  • CGlib動態(tài)代理

“java反射的用途及實現(xiàn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

當(dāng)前標(biāo)題:java反射的用途及實現(xiàn)
轉(zhuǎn)載來于:http://jinyejixie.com/article18/iicsdp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、企業(yè)建站靜態(tài)網(wǎng)站、微信小程序、品牌網(wǎng)站設(shè)計、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名
澄迈县| 乌兰浩特市| 同仁县| 兴业县| 南昌县| 荣昌县| 文登市| 巢湖市| 浦东新区| 诏安县| 鄂托克旗| 交城县| 三亚市| 苗栗县| 慈利县| 历史| 海晏县| 阳谷县| 蓝田县| 大庆市| 郴州市| 年辖:市辖区| 兴文县| 和静县| 垣曲县| 开鲁县| 黄骅市| 伊吾县| 阿拉善盟| 万荣县| 彰化县| 临潭县| 贺兰县| 咸宁市| 普格县| 鱼台县| 阳信县| 西盟| 弥渡县| 巫山县| 抚顺市|