国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【從零到Offer】反射那些事

這篇具有很好參考價值的文章主要介紹了【從零到Offer】反射那些事。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

什么是反射?

? 反射簡單來說,就是在代碼運(yùn)行期間,通過動態(tài)指定任意一個類,從而構(gòu)建對象,并了解該類的成員變量和方法,甚至可以調(diào)用任意一個對象的屬性和方法。以String對象為例子,傳統(tǒng)構(gòu)造方式和反射的實(shí)現(xiàn)方式如下:

//new 構(gòu)造方法
String s = new String();

//反射
Class<?> forName = Class.forName("java.lang.String");

? 從代碼中不難看到,第一種通過構(gòu)造函數(shù)構(gòu)造出來的對象,是在編譯前就確定好了的。由此編譯程序可以明確的知道當(dāng)前操作的類是哪個,包含哪些屬性、有什么方法。

? 然而對于第二種實(shí)現(xiàn)方式來說,通過反射映射出來的對象完全取決于你給定的字符串是什么。如果我們將這個字符串抽取成配置,那么生產(chǎn)出來的對象自然就會是動態(tài)的了。

為什么需要反射?

? 那么,你可能想問了,好好的new 對象不好嗎?為啥還要設(shè)計出來一個反射呀?他有什么好處呢?其實(shí),直白來講,反射犧牲掉了安全、效率,更多的是為了提供更多的靈活性。

? 假設(shè)當(dāng)前你所負(fù)責(zé)的代碼,要處理兩個不同的對象,那么為了完成工作,你可能需要通過多次的if-else判斷、處理,哪怕兩個對象內(nèi)的字段名稱、類型都是一樣的,受限于編譯器的限制,你也沒法共用同一段代碼。

if (i==1){
    // ....執(zhí)行針對ObjectA的處理方法
    ObjectA o = (ObjectA) input;
    o.setData(xxx);
} else if (i==2) {
    // ....執(zhí)行針對ObjectB的處理方法
    ObjectB o = (ObjectB) input; 
    o.setData(xxx);
}

? 但是如果借助于反射,我們就可以將代碼充分利用起來,從而最大程度減少代碼開發(fā),提升日常效率

if (i==1){
    // ....執(zhí)行針對ObjectA的處理方法
    Class<?> forName = Class.forName("com.example.demo.base.dto.ObjectA");
} else if (i==2) {
    // ....執(zhí)行針對ObjectB的處理方法
    Class<?> forName = Class.forName("com.example.demo.base.dto.ObjectB");
}       
Object o = (Object) input;

//同一段處理邏輯,無需再寫兩次
Field resultStr = forName.getDeclaredField("resultStr");
resultStr.set(o, "1");

? 在日常代碼開發(fā)中,也有很多組件無形之中使用到了反射的設(shè)計原理。如我們熟悉的Bean拷貝組件BeanUtils,其方便的實(shí)現(xiàn)對象間的拷貝邏輯就是基于反射實(shí)現(xiàn)的。

?

如何實(shí)現(xiàn)反射?

? 首先我們知道,我們?nèi)粘K帉懙拇a,最后都是會變成.java格式的文檔。而.java格式的文檔是不可能被機(jī)器直接執(zhí)行的,因?yàn)闄C(jī)器只能夠看懂二進(jìn)制的文件。

? 因此,從.java文件到j(luò)vm中可執(zhí)行的對象,它其實(shí)經(jīng)過了如下的過程:

【從零到Offer】反射那些事,開發(fā)語言,java,spring boot

? 首先,我們的.java文件會被編譯器編譯成.class文件,對于每個.class文件,又會被JVM調(diào)用類加載的方式,加載到JVM內(nèi)存中并生成為一個Class對象。這里我們簡單看一下Class對象長什么模樣:

【從零到Offer】反射那些事,開發(fā)語言,java,spring boot

? 可以看到Class類對象中包含了許多用于描述類的屬性,如類名、所使用的類加載器等。包括通過Class類對象也可以搜索到當(dāng)前類的構(gòu)造器、特定的屬性域等。

? 而且對于這個特殊的類來說,我們是不能夠?qū)ζ溥M(jìn)行初始化的??梢钥吹?,它只提供了一個私有的構(gòu)造方法,且需要傳入的是類加載器。而且在方法的注釋上,也很明確的標(biāo)注出來,這個構(gòu)造方法只是提供給JVM創(chuàng)建實(shí)例用的,不應(yīng)該作為默認(rèn)的類構(gòu)造器。

【從零到Offer】反射那些事,開發(fā)語言,java,spring boot

? 通常來說,如果我們需要調(diào)用一個Class對象,那么通常只能通過以下的方式:

Class<?> clz = Class.forName("xxx.class");
Class<?> clz = Object.class;
Class<?> clz = Object.getClass();

? 而且通過不斷的往下搜索,我們也可以看到,這個方法的底層實(shí)現(xiàn)是通過native方法實(shí)現(xiàn)的。(部分java代碼通過c等語言實(shí)現(xiàn)的,此時會被標(biāo)記為native方法,是不可以直接調(diào)用的。)

【從零到Offer】反射那些事,開發(fā)語言,java,spring boot

? 雖然我們不能調(diào)用,但是本質(zhì)上這個方法就是通過類加載器獲取的過程。了解了這些之后,我們再將咱們的日常使用java類的過程梳理一下:

【從零到Offer】反射那些事,開發(fā)語言,java,spring boot

? 所以可以看到,反射本質(zhì)上,維護(hù)實(shí)例的流程同正常的new創(chuàng)建對象并無過多的差異,他們本質(zhì)都是基于class對象生成的實(shí)例,只是通過new的方式,用戶是能夠明確知道所需要使用的類的,因此編譯器也能方便的對代碼進(jìn)行檢查。

? 而使用反射的方式,則是利用了Class對象,創(chuàng)造出了編碼的靈活性。本質(zhì)思想就是:“你可以是任何類,但我的邏輯對任何類都適配。”通過這樣的犧牲掉一些安全性,從而獲得編碼的靈活性。

參考文獻(xiàn)

學(xué)習(xí)java應(yīng)該如何理解反射?

java的反射到底是有什么用處?怎么用?文章來源地址http://www.zghlxwxcb.cn/news/detail-575074.html

到了這里,關(guān)于【從零到Offer】反射那些事的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 開發(fā)一個Android應(yīng)用:從零到一的實(shí)踐指南

    在這篇博文中,我們將逐步探討如何從頭開始構(gòu)建一個Android應(yīng)用。我們將從最基本的環(huán)境搭建開始,然后深入討論組件、布局和其他核心概念。在完成整個過程后,你將會掌握一個簡單但完整的Android應(yīng)用開發(fā)流程。讓我們開始吧! 準(zhǔn)備開發(fā)環(huán)境 創(chuàng)建項(xiàng)目 理解項(xiàng)目結(jié)構(gòu) 設(shè)計

    2024年02月08日
    瀏覽(57)
  • UI/UX設(shè)計與前端開發(fā):從零到一打造完美用戶體驗(yàn)

    在當(dāng)今的軟件開發(fā)領(lǐng)域,UI/UX設(shè)計和前端開發(fā)是兩個密不可分的環(huán)節(jié)。UI/UX設(shè)計師負(fù)責(zé)創(chuàng)造出直觀、美觀、用戶友好的界面,而前端開發(fā)者則將這些設(shè)計轉(zhuǎn)化為實(shí)際的、可交互的網(wǎng)頁或應(yīng)用。本文將深入探討這兩個領(lǐng)域的交集,并通過代碼示例來展示如何實(shí)現(xiàn)出色的用戶體驗(yàn)。

    2024年02月11日
    瀏覽(39)
  • 【從零開始學(xué)習(xí)JAVA | 第四十五篇】反射

    【從零開始學(xué)習(xí)JAVA | 第四十五篇】反射

    目錄 前言: ?反射: ?使用反射的步驟: 1.獲取階段: 2.使用階段: 反射的應(yīng)用場景: 使用反射的優(yōu)缺點(diǎn): 總結(jié): Java中的反射是一項(xiàng)強(qiáng)大而靈活的功能,它允許程序在運(yùn)行時 動態(tài)地獲取、操作和利用類的信息 。通過反射,我們可以在運(yùn)行時檢查和修改類的屬性、調(diào)用類

    2024年02月13日
    瀏覽(90)
  • “從零開始學(xué)習(xí)Spring Boot:快速搭建Java后端開發(fā)環(huán)境“

    標(biāo)題:從零開始學(xué)習(xí)Spring Boot:快速搭建Java后端開發(fā)環(huán)境 摘要:本文將介紹如何從零開始學(xué)習(xí)Spring Boot,并詳細(xì)講解如何快速搭建Java后端開發(fā)環(huán)境。通過本文的指導(dǎo),您將能夠快速搭建一個基于Spring Boot的Java后端開發(fā)環(huán)境并開始編寫代碼。 正文: 一、準(zhǔn)備工作 在開始之前,

    2024年02月15日
    瀏覽(35)
  • 從零開始學(xué)習(xí) Java:簡單易懂的入門指南之反射(三十八)

    ? 專業(yè)的解釋: ? 是在運(yùn)行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法; ? 對于任意一個對象,都能夠調(diào)用它的任意屬性和方法; ? 這種動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能稱為Java語言的反射機(jī)制。 ? 通俗的理解: 利用 反射 創(chuàng)建的對象 可

    2024年02月08日
    瀏覽(90)
  • JVM:從零到入門

    JVM:從零到入門

    JVM,就是Java虛擬機(jī)。 JVM是一個巨大的話題,我們本文主要簡單介紹一些圍繞JVM相關(guān)的基礎(chǔ)知識。 目錄 JVM內(nèi)存區(qū)域劃分 本地方法棧 虛擬機(jī)棧 堆 程序計數(shù)器 方法區(qū)/ 元數(shù)據(jù)區(qū) 類加載 1.加載 2.驗(yàn)證 3.準(zhǔn)備 4.解析 5.初始化 雙親委派模型 垃圾回收機(jī)制 引用計數(shù) 可達(dá)性分析 如何

    2024年01月17日
    瀏覽(25)
  • Python從零到一構(gòu)建項(xiàng)目

    Python從零到一構(gòu)建項(xiàng)目

    隨著互聯(lián)網(wǎng)的發(fā)展,網(wǎng)絡(luò)上的信息量急劇增長,而獲取、整理和分析這些信息對于很多人來說是一項(xiàng)艱巨的任務(wù)。而Python作為一種功能強(qiáng)大的編程語言,它的爬蟲能力使得我們能夠自動化地從網(wǎng)頁中獲取數(shù)據(jù),大大提高了效率。本文將分享如何從零到一構(gòu)建一個簡單的網(wǎng)絡(luò)爬

    2024年02月09日
    瀏覽(29)
  • 從零到一發(fā)布 NPM 包

    從零到一發(fā)布 NPM 包

    如果你負(fù)責(zé)前端的基礎(chǔ)能力建設(shè),發(fā)布各種功能/插件包猶如家常便飯,所以熟悉對 npm 包的發(fā)布與管理是非常有必要的,故此有了本篇總結(jié)文章。本篇文章一方面總結(jié),一方面向社區(qū)貢獻(xiàn)開箱即用的 npm 開發(fā)、編譯、發(fā)布、調(diào)試模板,希望幫助到有需要的同學(xué)。 辛苦整理良久

    2023年04月08日
    瀏覽(23)
  • Qt - 從零到壹的 打地鼠 游戲

    Qt - 從零到壹的 打地鼠 游戲

    ?????歡迎收看西北風(fēng)的blog,好男人就是我,我就是西北風(fēng)。? Gitee 地址?W_A_Mole · NTC_jason/cc語言 - 碼云 - 開源中國 (gitee.com) 目錄 ??一:創(chuàng)建一個主窗體 ??二.:添加主窗口背景圖片以及相關(guān)部件? ??2.1 添加資源文件 ?2.1.1 添加資源文件 2.1.2 在項(xiàng)目中添加資源文件 ??

    2024年02月01日
    瀏覽(48)
  • Eclipse的android 安裝(從零到有)

    Eclipse的android 安裝(從零到有)

    ①JDK下載地址:https://www.oracle.com/downloads/; ②點(diǎn)擊Java(JDK) for Developers; ③然后選擇自己需要的jdk下載即可; ④雙擊運(yùn)行下載好的jdk文件,可以更改安裝路徑; ⑤安裝jdk成功后,將jdk的安裝路徑填寫在環(huán)境變量中。變量名:JAVA_HOME,變量值:jdk的安裝路徑; ⑥編輯Path變量,

    2023年04月08日
    瀏覽(15)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包