最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java反射的使用和原理詳解

 更新時(shí)間:2024年01月22日 09:21:39   作者:我不是歐拉_  
這篇文章主要介紹了Java反射的使用和原理詳解,反射是java語(yǔ)言的一個(gè)特性,它允程序在運(yùn)行時(shí)(注意不是編譯的時(shí)候)來(lái)進(jìn)行自我檢查并且對(duì)內(nèi)部的成員進(jìn)行操作,需要的朋友可以參考下

1. 反射是什么?

反射是java語(yǔ)言的一個(gè)特性,它允程序在運(yùn)行時(shí)(注意不是編譯的時(shí)候)來(lái)進(jìn)行自我檢查并且對(duì)內(nèi)部的成員進(jìn)行操作。

反射是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)類,都能夠知道這個(gè)類的所有屬性和方法,對(duì)于任意一個(gè)對(duì)象,都能夠調(diào)用它的任意方法和屬性,這種動(dòng)態(tài)獲取信息以及動(dòng)態(tài)調(diào)用對(duì)象方法的功能稱為java語(yǔ)言的反射機(jī)制。

一句話總結(jié):反射就是在運(yùn)行時(shí)才知道要操作的類是什么,并且可以在運(yùn)行時(shí)獲取類的完整構(gòu)造,并調(diào)用對(duì)應(yīng)的方法。

2. 為什么要用反射?

Java Reflection功能非常強(qiáng)大,并且非常有用,比如:

  • 獲取任意類的名稱、package信息、所有屬性、方法、注解、類型、類加載器等
  • 獲取任意對(duì)象的屬性,并且能改變對(duì)象的屬性
  • 調(diào)用任意對(duì)象的方法
  • 判斷任意一個(gè)對(duì)象所屬的類
  • 實(shí)例化任意一個(gè)類的對(duì)象
  • 通過(guò)反射我們可以實(shí)現(xiàn)動(dòng)態(tài)裝配,降低代碼的耦合度,動(dòng)態(tài)代理等。

3. 怎么使用反射?

一般情況下我們通過(guò)反射創(chuàng)建類對(duì)象主要有兩種方式:

  1. 通過(guò) Class 對(duì)象的 newInstance() 方法
  2. 通過(guò) Constructor 對(duì)象的 newInstance() 方法

第一種:通過(guò) Class 對(duì)象的 newInstance() 方法。

  • Class clz = Class.forName("com.mikechen.reflection.JiaGou");
  • JiaGou jg= (JiaGou)clz.newInstance();

第二種:通過(guò) Constructor 對(duì)象的 newInstance() 方法

  • Class clz = Class.forName("com.mikechen.reflection.JiaGou");
  • Constructor constructor = clz.getConstructor();
  • JiaGou jg= (JiaGou)constructor.newInstance();

通過(guò) Constructor 對(duì)象創(chuàng)建類對(duì)象可以選擇特定構(gòu)造方法,而通過(guò) Class 對(duì)象則只能使用默認(rèn)的無(wú)參數(shù)構(gòu)造方法,下面的代碼就調(diào)用了一個(gè)有參數(shù)的構(gòu)造方法進(jìn)行了類對(duì)象的初始化。

  • Class clz = Class.forName("com.mikechen.reflection.JiaGou");
  • Constructor constructor = clz.getConstructor(String.class);
  • JiaGou jg= (JiaGou)constructor.newInstance("mikechen的互聯(lián)網(wǎng)架構(gòu)");

接下來(lái)我們就可以通過(guò)具體的API調(diào)用獲取到詳細(xì)的屬性或者方法等詳細(xì)了。

3.1 獲取類的成員變量的信息

Field[] fields = cls.getDeclaredFields();

3.2 獲得類方法

Method[] methods = cls.getDeclaredMethods();

3.3 獲得構(gòu)造函數(shù)

Constructor[] constructors = cls.getDeclaredConstructors();

這樣通過(guò)反射就可以做在運(yùn)行時(shí)獲取類的完整構(gòu)造,并獲得類信息了。

4. 反射工作原理

調(diào)用反射的總體流程如下:

1、當(dāng)我們編寫完一個(gè)Java項(xiàng)目之后,每個(gè)java文件都會(huì)被編譯成一個(gè).class文件。

2、這些class文件在程序運(yùn)行時(shí)會(huì)被ClassLoader加載到JVM中,當(dāng)一個(gè)類被加載以后,JVM就會(huì)在內(nèi)存中自動(dòng)產(chǎn)生一個(gè)Class對(duì)象。

3、通過(guò)Class對(duì)象獲取Field/Method/Construcor

我們一般平時(shí)是通過(guò)new的形式創(chuàng)建對(duì)象實(shí)際上就是通過(guò)這些Class來(lái)創(chuàng)建的,只不過(guò)這個(gè)class文件是編譯的時(shí)候就生成的,程序相當(dāng)于寫死了給jvm去跑。

反射是什么呢?當(dāng)我們的程序在運(yùn)行時(shí),需要?jiǎng)討B(tài)的加載一些類,這些類可能之前用不到所以不用加載到j(luò)vm,而是在運(yùn)行時(shí)根據(jù)需要才加載。

原來(lái)使用new的時(shí)候,需要明確的指定類名,這個(gè)時(shí)候?qū)儆谟簿幋a實(shí)現(xiàn),而在使用反射的時(shí)候,可以只傳入類名參數(shù),就可以生成對(duì)象,降低了耦合性,使得程序更具靈活性。

5. 反射的應(yīng)用場(chǎng)景

舉個(gè)例子我們的項(xiàng)目底層數(shù)據(jù)庫(kù)有時(shí)是用mysql,有時(shí)用oracle,需要?jiǎng)討B(tài)地根據(jù)實(shí)際情況加載驅(qū)動(dòng)類,這個(gè)時(shí)候反射就有用了,假設(shè) com.mikechen.java.myqlConnection,com.mikechen.java.oracleConnection這兩個(gè)類我們要用。

這時(shí)候我們?cè)谑褂?JDBC 連接數(shù)據(jù)庫(kù)時(shí)使用 Class.forName()通過(guò)反射加載數(shù)據(jù)庫(kù)的驅(qū)動(dòng)程序,如果是mysql則傳入mysql的驅(qū)動(dòng)類,而如果是oracle則傳入的參數(shù)就變成另一個(gè)了。

Spring 框架的 IOC(動(dòng)態(tài)加載管理 Bean),Spring通過(guò)配置文件配置各種各樣的bean,你需要用到哪些bean就配哪些,spring容器就會(huì)根據(jù)你的需求去動(dòng)態(tài)加載,你的程序就能健壯地運(yùn)行。

還有Spring AOP(動(dòng)態(tài)代理)功能都和反射有關(guān)系。

除此之外還有很多框架:mybatis、dubbo、rocketmq等等都會(huì)用到反射機(jī)制。

到此這篇關(guān)于Java反射的使用和原理詳解的文章就介紹到這了,更多相關(guān)Java反射內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決IDEA?2022?Translation?翻譯文檔失敗:?未知錯(cuò)誤的問(wèn)題

    解決IDEA?2022?Translation?翻譯文檔失敗:?未知錯(cuò)誤的問(wèn)題

    這篇文章主要介紹了IDEA?2022?Translation?翻譯文檔失敗:?未知錯(cuò)誤,本文較詳細(xì)的給大家介紹了IDEA?2022?Translation未知錯(cuò)誤翻譯文檔失敗的解決方法,需要的朋友可以參考下
    2022-04-04
  • Java編程多線程之共享數(shù)據(jù)代碼詳解

    Java編程多線程之共享數(shù)據(jù)代碼詳解

    這篇文章主要介紹了Java編程多線程之共享數(shù)據(jù)代碼詳解,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • idea?2024使用Maven創(chuàng)建Java?Web項(xiàng)目詳細(xì)圖文教程

    idea?2024使用Maven創(chuàng)建Java?Web項(xiàng)目詳細(xì)圖文教程

    這篇文章主要給大家介紹了關(guān)于idea?2024使用Maven創(chuàng)建Java?Web項(xiàng)目的相關(guān)資料,介紹了如何使用Maven創(chuàng)建一個(gè)Spring?MVC項(xiàng)目,并配置Tomcat服務(wù)器以運(yùn)行一個(gè)簡(jiǎn)單的Helloworld?JSP頁(yè)面,需要的朋友可以參考下
    2024-12-12
  • SpringBoot實(shí)現(xiàn)登錄攔截器超詳細(xì)教程分享

    SpringBoot實(shí)現(xiàn)登錄攔截器超詳細(xì)教程分享

    對(duì)于管理系統(tǒng)或其他需要用戶登錄的系統(tǒng),登錄驗(yàn)證都是必不可少的環(huán)節(jié),尤其在?SpringBoot?開(kāi)發(fā)的項(xiàng)目中。本文為大家準(zhǔn)備了超詳細(xì)的SpringBoot實(shí)現(xiàn)登錄攔截器方法,快收藏一波吧
    2023-02-02
  • JavaScript 與 Java 區(qū)別介紹  學(xué)java怎么樣

    JavaScript 與 Java 區(qū)別介紹 學(xué)java怎么樣

    JavaScript 是一種嵌入式腳本文件,直接插入網(wǎng)頁(yè),有瀏覽器一邊解釋一邊執(zhí)行。而java 語(yǔ)言不一樣,他必須在JAVA虛擬機(jī)上運(yùn)行。而且事先需要進(jìn)行編譯。接下來(lái)腳本之家小編給大家揭曉js與java區(qū)別,感興趣的朋友一起看看吧
    2016-09-09
  • 解決swagger主頁(yè)訪問(wèn),返回報(bào)錯(cuò)500問(wèn)題

    解決swagger主頁(yè)訪問(wèn),返回報(bào)錯(cuò)500問(wèn)題

    在使用Swagger時(shí)遇到500錯(cuò)誤,通過(guò)仔細(xì)的debug發(fā)現(xiàn)問(wèn)題源于注解使用不當(dāng),具體表現(xiàn)為一個(gè)接口的入?yún)⒈诲e(cuò)誤地注解了三個(gè)參數(shù),而實(shí)際上只有兩個(gè),這導(dǎo)致了Swagger在解析時(shí)拋出了NullPointerException異常,解決方法是刪除錯(cuò)誤的第三個(gè)參數(shù)的注解
    2024-09-09
  • SpringBoot整合SpringDataJPA

    SpringBoot整合SpringDataJPA

    這篇文章主要介紹了SpringBoot整合SpringDataJPA代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-07-07
  • SpringBoot整合SpringSecurityOauth2實(shí)現(xiàn)鑒權(quán)動(dòng)態(tài)權(quán)限問(wèn)題

    SpringBoot整合SpringSecurityOauth2實(shí)現(xiàn)鑒權(quán)動(dòng)態(tài)權(quán)限問(wèn)題

    這篇文章主要介紹了SpringBoot整合SpringSecurityOauth2實(shí)現(xiàn)鑒權(quán)-動(dòng)態(tài)權(quán)限,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • HDFS-Hadoop NameNode高可用機(jī)制

    HDFS-Hadoop NameNode高可用機(jī)制

    本文詳細(xì)介紹了Hadoop NameNode高可用機(jī)制的各個(gè)方面內(nèi)容,NameNode 的可用性直接決定了 Hadoop 集群的可用性,感興趣的小伙伴可以參考本文章
    2021-08-08
  • 深入聊聊Java內(nèi)存泄露問(wèn)題

    深入聊聊Java內(nèi)存泄露問(wèn)題

    所謂內(nèi)存泄露就是指一個(gè)不再被程序使用的對(duì)象或變量一直被占據(jù)在內(nèi)存中,下面這篇文章主要給大家介紹了關(guān)于Java內(nèi)存泄露問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04

最新評(píng)論

西昌市| 区。| 离岛区| 青岛市| 简阳市| 东至县| 清河县| 平阴县| 泉州市| 海阳市| 平度市| 建阳市| 曲沃县| 永吉县| 邮箱| 原平市| 河北区| 陕西省| 安平县| 运城市| 祁连县| 明星| 长寿区| 鄢陵县| 鸡西市| 博白县| 井研县| 巴彦淖尔市| 天柱县| 崇义县| 永靖县| 电白县| 台中县| 昌图县| 昌邑市| 玉溪市| 青海省| 昔阳县| 东丰县| 滦平县| 桦川县|