反射的作用及應(yīng)用場景 java的反射到底是有什么用處?怎么用?
java的反射到底是有什么用處?怎么用?Java反射說的是在運(yùn)行狀態(tài)中,對于任何一個(gè)類,我們都能夠知道這個(gè)類有哪些方法和屬性。對于任何一個(gè)對象,我們都能夠?qū)λ姆椒ê蛯傩赃M(jìn)行調(diào)用。我們把這種動(dòng)態(tài)獲取對
java的反射到底是有什么用處?怎么用?
Java反射說的是在運(yùn)行狀態(tài)中,對于任何一個(gè)類,我們都能夠知道這個(gè)類有哪些方法和屬性。對于任何一個(gè)對象,我們都能夠?qū)λ姆椒ê蛯傩赃M(jìn)行調(diào)用。我們把這種動(dòng)態(tài)獲取對象信息和調(diào)用對象方法的功能稱之為反射機(jī)制。
可以不通過new關(guān)鍵字獲取對象并且使用類對象中的成員變量,方法,修飾符等等,在這里舉例獲取類。
第一種:使用Class.forName(String classPath) ClassPath:寫需要反射的類名,一般是以包名.類名。如:Class clazz = Class.forName("com.entity.Example")
第二種:直接使用Class clz = 類名.class
這種情況一般在我們知道有這個(gè)類的時(shí)候去使用。如:Class clz = Example.class
第三種:Class clz = 對象. getClass()
前提是對象已經(jīng)被實(shí)例化出來了 。如:
Example ex = new Example()
Class clz = ex.getClass()
這三種方法都有各自的優(yōu)點(diǎn),一般我們使用第一種比較多,按照自己的實(shí)際需求去使用才是最好的。反射有啥用?有啥應(yīng)用場景?
1.spring框架的ioc是基于java的反射機(jī)制。
2.JDBC 的數(shù)據(jù)庫的連接注冊驅(qū)動(dòng),獲取連接也是基于Java反射。
3.Hibernate,Mybatis都有運(yùn)用到反射。
Java反射到底慢在哪里?
先陳述一下結(jié)論:java的反射是慢,但是是相對于直接調(diào)用而言,慢也的確慢了一個(gè)數(shù)量級,不過在有些場景必須使用反射,并且在反射的時(shí)候,可以用一些手段進(jìn)行人工優(yōu)化
再說一下java反射之所以有一點(diǎn)慢的原因
1.java和python比起來,java是靜態(tài)語言類型,也就是說在編譯期java在編譯代碼的時(shí)候就會(huì)進(jìn)行類型的強(qiáng)檢驗(yàn),java會(huì)在編譯期進(jìn)行代碼優(yōu)化,而反射是在運(yùn)行時(shí)發(fā)生的,也就是說那些類型檢查,代碼優(yōu)化的事情放在了運(yùn)行時(shí),這個(gè)自然要耗費(fèi)一點(diǎn)時(shí)間
2.編譯期在運(yùn)行時(shí)很難做一些關(guān)于反射的優(yōu)化,現(xiàn)在的編譯期還不是非常智能,知道你用這段反射代碼需要做什么事情
3.再說一下,調(diào)用實(shí)現(xiàn)過程,在反射調(diào)用過程中,執(zhí)行者叫MethodAccessor,我記得這個(gè)對象是懶加載的,也就是說有可能第一次反射調(diào)用耗時(shí)可能會(huì)更長一點(diǎn),并且在調(diào)用的時(shí)候method.invoke方法還要對參數(shù)數(shù)組進(jìn)行包裝,可能涉及到參數(shù)類型適配,裝包拆包也有消耗,其實(shí)說到底,還是不知道具體的參數(shù)類型