java web java的反射到底是有什么用處?怎么用?
java的反射到底是有什么用處?怎么用?Java反射說的是在運(yùn)行狀態(tài)中,對(duì)于任何一個(gè)類,我們都能夠知道這個(gè)類有哪些方法和屬性。對(duì)于任何一個(gè)對(duì)象,我們都能夠?qū)λ姆椒ê蛯傩赃M(jìn)行調(diào)用。我們把這種動(dòng)態(tài)獲取對(duì)
java的反射到底是有什么用處?怎么用?
Java反射說的是在運(yùn)行狀態(tài)中,對(duì)于任何一個(gè)類,我們都能夠知道這個(gè)類有哪些方法和屬性。對(duì)于任何一個(gè)對(duì)象,我們都能夠?qū)λ姆椒ê蛯傩赃M(jìn)行調(diào)用。我們把這種動(dòng)態(tài)獲取對(duì)象信息和調(diào)用對(duì)象方法的功能稱之為反射機(jī)制。
可以不通過new關(guān)鍵字獲取對(duì)象并且使用類對(duì)象中的成員變量,方法,修飾符等等,在這里舉例獲取類。
第一種:使用Class.forName(String classPath) ClassPath:寫需要反射的類名,一般是以包名.類名。如:Class clazz = Class.forName("com.entity.Example")
第二種:直接使用Class clz = 類名.class
這種情況一般在我們知道有這個(gè)類的時(shí)候去使用。如:Class clz = Example.class
第三種:Class clz = 對(duì)象. getClass()
前提是對(duì)象已經(jīng)被實(shí)例化出來了 。如:
Example ex = new Example()
Class clz = ex.getClass()
這三種方法都有各自的優(yōu)點(diǎn),一般我們使用第一種比較多,按照自己的實(shí)際需求去使用才是最好的。反射有啥用?有啥應(yīng)用場(chǎng)景?
1.spring框架的ioc是基于java的反射機(jī)制。
2.JDBC 的數(shù)據(jù)庫的連接注冊(cè)驅(qū)動(dòng),獲取連接也是基于Java反射。
3.Hibernate,Mybatis都有運(yùn)用到反射。
Java中的反射,一般什么時(shí)候會(huì)用到?
做基礎(chǔ)框架的時(shí)候會(huì)用得上,一般應(yīng)用層面很少,不過這種東西,基本現(xiàn)在很多開源框架都已經(jīng)給你封裝好了,自己基本用不著寫。典型的除了樓上講的Hibernate之外,其實(shí)Spring也用到了。經(jīng)典的就是xml或者properties里面寫上了配置,然后在Java類里面解析xml或properties里面的內(nèi)容,得到一個(gè)字符串,然后用反射,根據(jù)這個(gè)字符串獲得某個(gè)類的實(shí)例,這樣就可以動(dòng)態(tài)配置一些東西,不用每一次都要在代碼里面去new或者做其他的事情,以后要改的話直接改配置文件,代碼維護(hù)起來就很方便了,同時(shí)有時(shí)候要適應(yīng)某些需求,Java類里面不一定能直接調(diào)用另外的方法,這時(shí)候也可以通過反射機(jī)制來實(shí)現(xiàn)。總的來說,自己寫的很少,具體什么時(shí)候要用那要看需求,樓上說得對(duì),無非就是根據(jù)一個(gè)String來得到你要的實(shí)體對(duì)象,然后調(diào)用它原來的東西。但是如果是要自己寫框架的話,那就會(huì)用得比較多了。