本篇內(nèi)容主要講解“Java反射機(jī)制怎么理解”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Java反射機(jī)制怎么理解”吧!
為零陵等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及零陵網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、零陵網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!1. 簡(jiǎn)介
定義:Java語言中 一種動(dòng)態(tài)(運(yùn)行時(shí))訪問、檢測(cè) & 修改它本身的能力
作用:動(dòng)態(tài)(運(yùn)行時(shí))獲取類的完整結(jié)構(gòu)信息 & 調(diào)用對(duì)象的方法
類的結(jié)構(gòu)信息包括:變量、方法等
正常情況下,Java類在編譯前,就已經(jīng)被加載到JVM中;而反射機(jī)制使得程序運(yùn)行時(shí)還可以動(dòng)態(tài)地去操作類的變量、方法等信息
2. 特點(diǎn)
2.1 優(yōu)點(diǎn)
靈活性高。因?yàn)榉瓷鋵儆趧?dòng)態(tài)編譯,即只有到運(yùn)行時(shí)才動(dòng)態(tài)創(chuàng)建 &獲取對(duì)象實(shí)例。
編譯方式說明:
1. 靜態(tài)編譯:在編譯時(shí)確定類型 & 綁定對(duì)象。如常見的使用new關(guān)鍵字創(chuàng)建對(duì)象
2. 動(dòng)態(tài)編譯:運(yùn)行時(shí)確定類型 & 綁定對(duì)象。動(dòng)態(tài)編譯體現(xiàn)了Java的靈活性、多態(tài)特性 & 降低類之間的藕合性
2.2 缺點(diǎn)
執(zhí)行效率低
因?yàn)榉瓷涞牟僮?主要通過JVM執(zhí)行,所以時(shí)間成本會(huì)高于直接執(zhí)行相同操作
因?yàn)榻涌诘耐ㄓ眯?,Java的invoke方法是傳object和object[]數(shù)組的?;绢愋蛥?shù)需要裝箱和拆箱,產(chǎn)生大量額外的對(duì)象和內(nèi)存開銷,頻繁促發(fā)GC。
編譯器難以對(duì)動(dòng)態(tài)調(diào)用的代碼提前做優(yōu)化,比如方法內(nèi)聯(lián)。
反射需要按名檢索類和方法,有一定的時(shí)間開銷。
容易破壞類結(jié)構(gòu)
因?yàn)榉瓷洳僮黟堖^了源碼,容易干擾類原有的內(nèi)部邏輯
3. 應(yīng)用場(chǎng)景
動(dòng)態(tài)獲取類文件結(jié)構(gòu)信息(如變量、方法等) & 調(diào)用對(duì)象的方法
常用的需求場(chǎng)景有:動(dòng)態(tài)代理、工廠模式優(yōu)化、Java JDBC數(shù)據(jù)庫操作等
下文會(huì)用實(shí)際例子詳細(xì)講解
4. 具體使用
4.1 Java反射機(jī)制提供的功能
4.2 實(shí)現(xiàn)手段
反射機(jī)制的實(shí)現(xiàn) 主要通過操作java.lang.Class類
下面將主要講解 java.lang.Class 類
4.2.1 java.lang.Class 類
定義:java.lang.Class類是反射機(jī)制的基礎(chǔ)
作用:存放著對(duì)應(yīng)類型對(duì)象的 運(yùn)行時(shí)信息
每種類型的Class對(duì)象只有1個(gè) = 地址只有1個(gè)
Java反射機(jī)制的實(shí)現(xiàn)除了依靠Java.lang.Class類,還需要依靠:Constructor類、Field類、Method類,分別作用于類的各個(gè)組成部分:
4.3 使用步驟
在使用Java反射機(jī)制時(shí),主要步驟包括:
1. 獲取 目標(biāo)類型的Class對(duì)象
2. 通過 Class 對(duì)象分別獲取Constructor類對(duì)象、Method類對(duì)象 & Field 類對(duì)象
3. 通過 Constructor類對(duì)象、Method類對(duì)象 & Field類對(duì)象分別獲取類的構(gòu)造函數(shù)、方法&屬性的具體信息,并進(jìn)行后續(xù)操作
下面,我將詳細(xì)講解每個(gè)步驟中的使用方法。
步驟1:獲取 目標(biāo)類型的Class對(duì)象
此處額外講一下java.lang.reflect.Type類
java.lang.reflect.Type是 Java中所有類型的父接口
這些類型包括:
之間的關(guān)系如下
步驟2:通過 Class 對(duì)象分別獲取Constructor類對(duì)象、Method類對(duì)象 & Field 類對(duì)象
步驟3:通過 Constructor類對(duì)象、Method類對(duì)象 & Field類對(duì)象分別獲取類的構(gòu)造函數(shù)、方法 & 屬性的具體信息 & 進(jìn)行操作
4.4 特別注意:訪問權(quán)限問題
背景
反射機(jī)制的默認(rèn)行為受限于Java的訪問控制
如,無法訪問( private )私有的方法、字段
沖突
Java安全機(jī)制只允許查看任意對(duì)象有哪些域,而不允許讀它們的值
若強(qiáng)制讀取,將拋出異常
解決方案
脫離Java程序中安全管理器的控制、屏蔽Java語言的訪問檢查,從而脫離訪問控制
具體實(shí)現(xiàn)手段:使用Field類、Method類 & Constructor類對(duì)象的setAccessible()
到此,相信大家對(duì)“Java反射機(jī)制怎么理解”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
分享名稱:Java反射機(jī)制怎么理解-創(chuàng)新互聯(lián)
URL網(wǎng)址:http://www.ekvhdxd.cn/article34/cogese.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷型網(wǎng)站建設(shè)、App開發(fā)、品牌網(wǎng)站制作、網(wǎng)站排名、面包屑導(dǎo)航、建站公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容