日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

一只可愛的小狐貍的博客,反射機制

誰能給我講一講Java中反射機制?

一只可愛的小狐貍的博客,反射機制


在學習 Java 反射之前,先讓我們看看這幾個概念 。01. 解釋型語言和編譯型語言解釋型語言:不需要編譯,在運行的時候逐行翻譯解釋;修改代碼時可以直接修改,可以快速部署,不過性能上會比編譯型語言稍差;比如 JavaScript、Python ;編譯型語言:需要通過編譯器將源代碼編譯成機器碼才能執(zhí)行;編譯之后如果需要修改代碼,在執(zhí)行之前就需要重新編譯 。
比如 C 語言;Java 嚴格來說也是編譯型語言,但又介于編譯型和解釋型之間;Java 不直接生成機器碼而是生成中間碼:編譯期間,是將源碼交給編譯器生成 class 文件(字節(jié)碼),這個過程中只做了翻譯的工作,并沒有把代碼放入內(nèi)存運行;當進入運行期,字節(jié)碼才被 Java 虛擬機加載、解釋成機器語言并運行 。
02. 動態(tài)語言和靜態(tài)語言動態(tài)語言:是指程序在運行時可以改變自身結(jié)構(gòu),在運行時確定數(shù)據(jù)類型,一個對象是否能執(zhí)行某操作,只取決于它有沒有對應的方法,而不在乎它是否是某種類型的對象;比如 JavaScript、Python 。靜態(tài)語言:相對于動態(tài)語言來說,在編譯時變量的數(shù)據(jù)類型就已經(jīng)確定(使用變量之前必須聲明數(shù)據(jù)類型),在編譯時就會進行類型是否匹配;比如 C 語言、Java ;03. 反射的概念Java 反射機制:在運行過程中,對于任意一個類,都能知道其所有的屬性和方法;對于任意一個對象,都能調(diào)用其屬性和方法;這種動態(tài)獲取類信息和調(diào)用對象方法的功能,就是 Java 反射機制 。
既然反射里面有一個“反”字,那么我們先看看何為“正” 。在 Java 中,要使用一個類中的某個方法,“正向”都是這樣的:那么反向(反射)要如何實現(xiàn)?兩段代碼執(zhí)行的結(jié)果是一樣的,但是“正向”代碼在編譯前,就已經(jīng)明確了要運行的類是什么(ArrayList),而第二段代碼,只有在代碼運行時,才知道運行的類是 java.util.ArrayList 。
04. 反射的作用講到這里,有些同學可能會有疑問:“反射有什么用?我明明都已經(jīng)知道了要使用的類是 ArrayList ,我不能直接 new 一個對象然后執(zhí)行里面的方法么?”當然可以!不過很多場景中,在代碼運行之前并不知道需要使用哪個類,或者說在運行的時候才決定使用哪個類;比如有這么一個功能:“調(diào)用阿里云的人臉識別 API ”;這還不簡單,參考對方的 API 文檔,很快就能實現(xiàn) 。
上線一個月后,領(lǐng)導說:“咱公司開始和騰訊云合作了,人臉識別的接口改一下吧” 。修改上線運行了兩個月,領(lǐng)導說:“換回來吧”......當然有聰明的程序員會想到設(shè)置一個開關(guān)配置,讓開關(guān)決定走哪段代碼邏輯,如果領(lǐng)導哪天想變成亞馬遜云的服務,繼續(xù)寫 if-else 就好了:不過還有一種更好的方法:1. 定義一個接口:2. 多個實現(xiàn)類:3. 在調(diào)用人臉識別功能的代碼中:如果上面這個例子,你依然覺得在調(diào)用方法中做 if-else 判斷,和使用反射實現(xiàn)并沒有差太多,但是如果程序員 A 提供接口,程序員 B 提供實現(xiàn),程序員 C 寫客戶端呢?回憶一下 JDBC 的使用,比如創(chuàng)建一個連接:其中:程序員 A 提供接口:Oracle 公司(之前的 Sun)提供 JDBC 標準(接口) 。
程序員 B 提供實現(xiàn):各個數(shù)據(jù)庫廠商提供針對自家數(shù)據(jù)庫的實現(xiàn) 。程序員 C 寫客戶端:我等碼農(nóng)在 Java 中敲代碼訪問數(shù)據(jù)庫 ??偨Y(jié)一下Java 反射的作用:可以設(shè)計出更為通用和靈活的架構(gòu),很多框架為了保證其通用性,可以根據(jù)配置加載不用的類,這時候要用到反射 。除此之外:動態(tài)代理:在不改變目標對象方法的情況下對方法進行增強,比如使用 AOP 攔截某些方法打印日志,這就需要通過反射執(zhí)行方法中的內(nèi)容 。

推薦閱讀