亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        淺談Java語言中的反射機制及應(yīng)用

        2018-06-11 01:49:24杜叔強
        科學(xué)與財富 2018年12期

        杜叔強

        摘 要:反射是Java語言中的一種重要的編程機制;總結(jié)了Java語言中反射的原理,以及反射相關(guān)類的獲取方式,并總結(jié)了反射機制的幾點應(yīng)用。

        關(guān)鍵詞:反射機制 Class Constructor Field Method

        1反射的概念

        Java反射是Java被視為動態(tài)(或準動態(tài))語言的一個關(guān)鍵性質(zhì)。這個機制允許程序在運行時通過反射API取得任何一個已知名稱的類的內(nèi)部信息,包括其訪問修飾符、父類、實現(xiàn)的接口,也包括屬性和方法的所有信息,并可在運行時改變屬性值或進行方法調(diào)用。Java反射機制容許程序在運行時加載、探知、使用編譯期間完全未知的類。也就是說,Java可以加載一個運行時才得知名稱的類,并且獲得其完整結(jié)構(gòu)信息,這種動態(tài)獲取信息以及動態(tài)調(diào)用對象的成員的功能稱為java語言的反射機制[1]。

        2反射的原理

        Java反射機制的實現(xiàn)要借助于4個類:Class,Constructor,F(xiàn)ield,Method;其中Class代表的是類對象,Constructor是類的構(gòu)造器對象,F(xiàn)ield是類的屬性對象,Method是類的方法對象,通過這四個對象我們可以粗略的看到一個類的各個組成部分。其中最核心的就是Class類,它是實現(xiàn)反射的基礎(chǔ)。Class類的實例就是某個類的描述信息。Class類的實例表示正在運行的Java應(yīng)用程序中的類和接口。

        Class沒有公共構(gòu)造方法。Class對象是在加載類時由Java虛擬機以及通過調(diào)用類加載器中的defineClass方法自動構(gòu)造的。JVM在程序第一次主動使用某個類的時候,才會去加載該類。也就是說,JVM并不是在一開始就把一個程序所有的類都加載到內(nèi)存中,而是到用的時候才把它加載進來,而且只加載一次。當JVM加載某個類時,會到本地磁盤去找到這個類的字節(jié)碼文件,然后將這個字節(jié)碼文件加載到JVM內(nèi)存中,并且在內(nèi)存堆區(qū)創(chuàng)建這個類的Class對象。注意這個不是new出來的對象,而是類的類型描述對象,每個類只有一個Class對象,作為類的數(shù)據(jù)結(jié)構(gòu)的接口。JVM創(chuàng)建對象前,會先檢查類是否加載,尋找類對應(yīng)的Class對象,若類已加載好,則為待創(chuàng)建對象分配內(nèi)存。有了類型信息描述對象Class對象,就可以獲取類的屬性,方法等信息。

        3 Class對象的獲取

        有三種方式可以獲取Class對象[2]。

        (1)通過類.class屬性獲得。任何數(shù)據(jù)類型都有一個“靜態(tài)”的class屬性。Java在編譯一個類文件時,會為該類動態(tài)地添加一個公有的靜態(tài)常量屬性class,這個屬性記錄了該類的相關(guān)信息,即類型描述信息,它是Class類的實例。

        (2)通過對象.getClass()方法獲得。任何對象都可以調(diào)用getClass()返回表示此對象運行時類的Class對象。當?shù)玫揭粋€對象引用而不知道所屬的類時,就可以用此方法得到該對象所屬類的Class對象。

        (3)通過Class.formName()靜態(tài)方法獲得。Java的Class提供了靜態(tài)方法formName(),此方法顯示地加載指定類,并返回被加載類的Class對象。

        4 Constructor對象的獲取

        Constructor類的對象用于描述類的單個構(gòu)造方法。Class對象提供了四個方法可以獲取Constructor對象。

        (1)getConstructor(Class parameterTypes…)獲取指定參數(shù)類型的公有Constructor對象。

        (2)getConstructors()獲取指定類的公有構(gòu)造方法描述對象Constructor列表。

        (3)getDeclaredConstructor(Class parameterTypes…)獲取指定參數(shù)類型的構(gòu)造方法描述對象。

        (4)getDeclaredConstructors()獲取指定類的所有構(gòu)造方法描述對象列表。

        5 Method對象的獲取

        Method類的對象用于描述類的單個方法(不包括構(gòu)造方法)。可以通過Method類來獲取方法的訪問權(quán)限、參數(shù)類型、返回值類型等信息,并且可以通過獲取的Method對象來動態(tài)執(zhí)行方法。Class對象提供了四個方法可以獲取Method對象。

        (1)getMethod(String name,Class parameterTypes…)獲取指定名稱和參數(shù)類型的公有方法描述對象。

        (2)getMethods()獲取公有的方法描述對象列表。

        (3)getDeclaredMethod(String name, Class parameterTypes…)獲取指定名稱和參數(shù)類型的方法描述對象。

        (4)getDeclaredMethods()獲取類本身定義的所有方法描述對象。

        6 Field對象的獲取

        Field類的對象用于描述類的單個屬性??梢酝ㄟ^Field對象來獲取屬性的訪問權(quán)限、屬性類型等信息,并且可以通過獲取的Field對象來動態(tài)地修改屬性值。Class對象也提供了四個方法可以獲取Field對象。

        (1)getField(String name)獲取指定名稱的公有Field對象。

        (2)getFields()獲取指定類的公有屬性描述對象Field列表。

        (3)getDeclaredField(String name)獲取指定名稱的Field對象。

        (4)getDeclaredFields()獲取指定類的所有屬性描述對象Field列表。

        7反射的應(yīng)用

        (1)運行時類型識別

        Class對象的isInstance()方法其原型是public boolean isInstance(Object obj),這個方法用來判定指定的對象是不是類的實例。例如從一個容器中取得了對象后,就可以判定這個對象的所屬的類。

        (2)獲取資源文件的URL

        Class對象的getResource()方法其原型是public URL getResource(String name),此方法可以返回與給定類相關(guān)的指定名稱的資源URL。如果程序中用到圖片、音頻等資源,可以將這些資源放到相關(guān)類字節(jié)碼文件相同目錄,便于程序打包成jar文件。

        (3)動態(tài)獲取類型信息

        在程序中可以通過反射顯式加載指定類,通過反射實例化類,還可以通過反射執(zhí)行方法,修改屬性值和訪問權(quán)限等操作。

        8小結(jié)

        Java中反射機制很實用,靈活使用反射能讓我們代碼更加靈活。但是反射也有缺點,反射包括了一些動態(tài)類型,所以 JVM 無法對這些代碼進行優(yōu)化。因此,反射操作的效率要比那些非反射操作低得多。我們應(yīng)該避免在經(jīng)常被執(zhí)行的代碼或?qū)π阅芤蠛芨叩某绦蛑惺褂梅瓷鋄3]。

        參考文獻:

        [1]Java基礎(chǔ)之—反射[EB/OL].[2018-03-17].http://blog.csdn.net/sinat_38259539/article/details/71799078

        [2]徐傳運 張楊.Java高級程序設(shè)計[M].北京:清華大學(xué)出版社,2014.

        [3]粗淺看 java反射機制[EB/OL].[2018-03-17.http://blog.csdn.net/wsl211511/article/details/51605655

        精品人妻一区二区三区四区| 亚洲成生人免费av毛片| 日本在线一区二区三区观看| 91九色播放在线观看| 校园春色综合久久精品中文字幕| 亚洲av美国av产亚洲av图片| 人人妻人人澡人人爽欧美二区| 免费特级黄毛片| 亚洲春色AV无码专区在线播放| 国产自产拍精品视频免费看| 手机在线免费观看的av| 亚洲精一区二区三av| 国产精品久久久久久| 国产真实乱对白精彩久久老熟妇女| 野花社区视频www官网| 伊伊人成亚洲综合人网7777 | 精品亚洲视频免费观看网站| 亚洲精品中文字幕一二 | 亚洲av日韩精品久久久久久a| 亚洲男人的天堂在线播放 | 亚洲精品在线一区二区| 亚洲精品国产一区二区| 99精品国产99久久久久久97| 一本大道香蕉视频在线观看| 日韩免费高清视频网站| 偷拍一区二区三区在线观看| 蜜桃av噜噜一区二区三区9| 欧美人妻aⅴ中文字幕| 伊人色综合视频一区二区三区| 依依成人影视国产精品| 一区二区三区日韩蜜桃| 波多野结衣久久精品99e| 国产成人精品日本亚洲18| 韩国美女主播国产三级| 丝袜美腿亚洲综合第一页| 国产老熟女网站| 亚洲AV电影天堂男人的天堂| 国产福利小视频91| 亚洲国产成人久久精品一区| 久久久久亚洲av综合波多野结衣| 色一情一乱一乱一区99av|