java反射三種方法(java反射原理簡單介紹)

各位老鐵們,大家好,今天由我來為大家分享java反射三種方法,以及java反射原理簡單介紹的相關(guān)問題知識,希望對大家有所幫助。如果可以幫助到大家,還望關(guān)注收藏下本站,您...
各位老鐵們,大家好,今天由我來為大家分享java反射三種方法,以及java反射原理簡單介紹的相關(guān)問題知識,希望對大家有所幫助。如果可以幫助到大家,還望關(guān)注收藏下本站,您的支持是我們最大的動力,謝謝大家了哈,下面我們開始吧!
java如何用反射獲取類實例
想了解更多Java相關(guān),百度搜索圈T社區(qū),免費視頻教程。純干貨
publicclassDemo{privateStringkey1="1";privateStringkey2="2";publicStringgetKey1(){returnkey1;}publicvoidsetKey1(Stringkey1){this.key1=key1;}publicStringgetKey2(){returnkey2;}publicvoidsetKey2(Stringkey2){this.key2=key2;}publicstaticvoidmain(String[]args)throwsException{//參數(shù)“Demo”是類的全名,如果在包結(jié)構(gòu)下,要有完整包路徑比如:com.test.DemoClass<?>clazz=Class.forName("Demo");//“Demo”類必須有默認(rèn)構(gòu)造方法,否則會拋出異常Demodemo=(Demo)clazz.newInstance();System.out.println(demo.getKey1());System.out.println(demo.getKey2());}}
反射機制是不是Java的精華
肯定是啊,沒有反射就沒有aop,ico至少沒現(xiàn)在這么優(yōu)雅
誰能給我講一講Java中反射機制
在學(xué)習(xí)Java反射之前,先讓我們看看這幾個概念。
01.解釋型語言和編譯型語言解釋型語言:不需要編譯,在運行的時候逐行翻譯解釋;修改代碼時可以直接修改,可以快速部署,不過性能上會比編譯型語言稍差;比如JavaScript、Python;
編譯型語言:需要通過編譯器將源代碼編譯成機器碼才能執(zhí)行;編譯之后如果需要修改代碼,在執(zhí)行之前就需要重新編譯。比如C語言;
Java嚴(yán)格來說也是編譯型語言,但又介于編譯型和解釋型之間;Java不直接生成機器碼而是生成中間碼:編譯期間,是將源碼交給編譯器生成class文件(字節(jié)碼),這個過程中只做了翻譯的工作,并沒有把代碼放入內(nèi)存運行;當(dāng)進(jìn)入運行期,字節(jié)碼才被Java虛擬機加載、解釋成機器語言并運行。
02.動態(tài)語言和靜態(tài)語言動態(tài)語言:是指程序在運行時可以改變自身結(jié)構(gòu),在運行時確定數(shù)據(jù)類型,一個對象是否能執(zhí)行某操作,只取決于它有沒有對應(yīng)的方法,而不在乎它是否是某種類型的對象;比如JavaScript、Python。
靜態(tài)語言:相對于動態(tài)語言來說,在編譯時變量的數(shù)據(jù)類型就已經(jīng)確定(使用變量之前必須聲明數(shù)據(jù)類型),在編譯時就會進(jìn)行類型是否匹配;比如C語言、Java;
03.反射的概念Java反射機制:在運行過程中,對于任意一個類,都能知道其所有的屬性和方法;對于任意一個對象,都能調(diào)用其屬性和方法;這種動態(tài)獲取類信息和調(diào)用對象方法的功能,就是Java反射機制。
既然反射里面有一個“反”字,那么我們先看看何為“正”。
在Java中,要使用一個類中的某個方法,“正向”都是這樣的:
那么反向(反射)要如何實現(xiàn)?
兩段代碼執(zhí)行的結(jié)果是一樣的,但是“正向”代碼在編譯前,就已經(jīng)明確了要運行的類是什么(ArrayList),而第二段代碼,只有在代碼運行時,才知道運行的類是java.util.ArrayList。
04.反射的作用講到這里,有些同學(xué)可能會有疑問:“反射有什么用?我明明都已經(jīng)知道了要使用的類是ArrayList,我不能直接new一個對象然后執(zhí)行里面的方法么?”
當(dāng)然可以!不過很多場景中,在代碼運行之前并不知道需要使用哪個類,或者說在運行的時候才決定使用哪個類;
比如有這么一個功能:“調(diào)用阿里云的人臉識別API”;這還不簡單,參考對方的API文檔,很快就能實現(xiàn)。
上線一個月后,領(lǐng)導(dǎo)說:“咱公司開始和騰訊云合作了,人臉識別的接口改一下吧”。
修改上線運行了兩個月,領(lǐng)導(dǎo)說:“換回來吧”......
當(dāng)然有聰明的程序員會想到設(shè)置一個開關(guān)配置,讓開關(guān)決定走哪段代碼邏輯,如果領(lǐng)導(dǎo)哪天想變成亞馬遜云的服務(wù),繼續(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標(biāo)準(zhǔn)(接口)。程序員B提供實現(xiàn):各個數(shù)據(jù)庫廠商提供針對自家數(shù)據(jù)庫的實現(xiàn)。程序員C寫客戶端:我等碼農(nóng)在Java中敲代碼訪問數(shù)據(jù)庫。總結(jié)一下Java反射的作用:可以設(shè)計出更為通用和靈活的架構(gòu),很多框架為了保證其通用性,可以根據(jù)配置加載不用的類,這時候要用到反射。除此之外:
動態(tài)代理:在不改變目標(biāo)對象方法的情況下對方法進(jìn)行增強,比如使用AOP攔截某些方法打印日志,這就需要通過反射執(zhí)行方法中的內(nèi)容。注解:利用反射機制,獲取注解并執(zhí)行對應(yīng)的行為。05.用反射的用法上文中我們知道了Java運行期的源文件是class文件(字節(jié)碼),所以要使用反射,那么就需要獲取到字節(jié)碼文件對象,在Java中,獲取字節(jié)碼文件對象有三種方式:
調(diào)用某個類的class屬性:類名.class調(diào)用對象的getClass()方法:對象.getClass()使用Class類中的forName()靜態(tài)方法:Class.forName(類的全路徑),建議使用這種方法java.lang.reflect類庫提供了對反射的支持:
Field:可以使用get和set方法讀取和修改對象的屬性;Method:可以使用invoke()方法調(diào)用對象中的方法;Constructor:可以用newInstance()創(chuàng)建新的對象。06.反射的優(yōu)缺點優(yōu)點:在運行時動態(tài)獲取類和對象中的內(nèi)容,極大地提高系統(tǒng)的靈活性和擴展性;夸張一些說,反射是框架設(shè)計的靈魂。
缺點:會有一定的性能損耗,JVM無法對這些代碼進(jìn)行優(yōu)化;破壞類的封裝性。
總之,可能大家在平時的開發(fā)過程中,感覺自己并沒有寫過反射相關(guān)的代碼,但是在我們用到的各種開源框架中,反射無處不在。
我將持續(xù)分享Java開發(fā)、架構(gòu)設(shè)計、程序員職業(yè)發(fā)展等方面的見解,希望能得到你的關(guān)注;關(guān)注我后,可私信發(fā)送數(shù)字【1】,獲取海量學(xué)習(xí)資料。關(guān)于java反射三種方法和java反射原理簡單介紹的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
本文鏈接:http://xinin56.com/kaifa/3103.html