-
Java動(dòng)態(tài)加載類
知識(shí)點(diǎn)1:
Class.forName("類的全稱"),不僅表示了對(duì)象的類類型,還代表了動(dòng)態(tài)加載類。
靜態(tài)加載類:編譯時(shí)刻加載類(通過(guò)new關(guān)鍵字創(chuàng)建的對(duì)象)。
動(dòng)態(tài)加載類:運(yùn)行時(shí)刻加載類(Class.forName(),得到類類型調(diào)用newInstance())。
案例:區(qū)分編譯時(shí)刻加載類和運(yùn)行時(shí)刻加載類(使用EditPlus工具,Eclipse表現(xiàn)不明顯)。
描述:在 main 函數(shù)中,有一個(gè) String args[] 參數(shù),這就表示在執(zhí)行某 .class 文件時(shí),可以對(duì) main 函數(shù)傳字符串參數(shù)(例如:命令行中:java OfficeBetter Excel,傳給主函數(shù)的參數(shù)就是Excel,如果傳多個(gè)參數(shù),參數(shù)用空格隔開),Office類中使用了兩個(gè)類(沒(méi)有提供這兩個(gè)類),并調(diào)用其相應(yīng)的方法,然后進(jìn)行編譯報(bào)錯(cuò),提示找不到這兩個(gè)類,我們只提供了Word類和相應(yīng)方法,并對(duì)它進(jìn)行編譯(這是因?yàn)橹皇褂肳ord的功能),這時(shí)候再對(duì)Office這個(gè)類進(jìn)行編譯,這時(shí)候只報(bào)Excel找不到的錯(cuò)誤,現(xiàn)在核心問(wèn)題是只想使用Word,而不使用Excel這個(gè)類,但是報(bào)錯(cuò)(這樣就不能運(yùn)行,導(dǎo)致不能使用Word的功能),因?yàn)閚ew 對(duì)象是靜態(tài)加載類的方式,在編譯時(shí)刻就需要加載所有可能使用到的類,但實(shí)際應(yīng)用希望用到哪個(gè)類加載哪個(gè)類,這樣就不會(huì)在編譯時(shí)報(bào)錯(cuò),并且可以運(yùn)行,所以可以通過(guò)動(dòng)態(tài)加載類來(lái)解決該問(wèn)題,通過(guò)Class.forName(args[0])動(dòng)態(tài)加載這個(gè)類的Class實(shí)例對(duì)象,通過(guò)傳入一個(gè)類的路徑,即使沒(méi)有這個(gè)類,編譯時(shí)刻也不會(huì)報(bào)錯(cuò),但運(yùn)行時(shí)刻會(huì)報(bào)錯(cuò),緊接著就可以通過(guò)Office的類類型創(chuàng)建Word對(duì)象,如果強(qiáng)制轉(zhuǎn)換為Excel類型,但是加載時(shí)卻是Word類,就可能發(fā)生錯(cuò)誤,這時(shí)就需要給Word和Excel指定一個(gè)標(biāo)準(zhǔn),也就是創(chuàng)建一個(gè)接口,并聲明相應(yīng)方法,并且讓W(xué)ord和Excel實(shí)現(xiàn)這個(gè)接口,如果傳入的參數(shù)是Excel,只需要再創(chuàng)建一個(gè)Excel并實(shí)現(xiàn)該接口,這樣就不用在主程序中修改類型了,實(shí)際應(yīng)用中功能類通常使用動(dòng)態(tài)加載類。
查看全部 -
Class類的使用
【一】Class類的使用
知識(shí)點(diǎn)1:Class類概念。
在面向?qū)ο蟮氖澜缋?,萬(wàn)事萬(wàn)物皆對(duì)象。
Java語(yǔ)言中,靜態(tài)的成員和普通數(shù)據(jù)類型不是對(duì)象,靜態(tài)成員屬于類,普通數(shù)據(jù)類型的包裝類是對(duì)象。
類是對(duì)象,類是java.lang.Class類的實(shí)例對(duì)象(可以理解為對(duì)象是類描述信息的實(shí)例,而類是Class描述信息的具體實(shí)例)
官網(wǎng)中把一個(gè)Foo的Class實(shí)例對(duì)象稱作Foo的類類型,類也是對(duì)象,是Class類的實(shí)例對(duì)象。
知識(shí)點(diǎn)2:獲取類類型的三種方式。
Class類實(shí)例對(duì)象的表示方式
Class的構(gòu)造方法為私有構(gòu)造方法,所以不可以通過(guò)new關(guān)鍵字創(chuàng)建,也就是只有Java虛擬機(jī)可以創(chuàng)建Class的實(shí)例對(duì)象,任何一個(gè)類都是Class的實(shí)例對(duì)象,這個(gè)實(shí)例對(duì)象有三種表示方式。
【a】任何一個(gè)類都有一個(gè)隱含的靜態(tài)成員變量class
? ? ? ? ?Class c1=Foo.class。
【b】通過(guò)該類的對(duì)象調(diào)用getClass方法
? ? ? ? ?Class c2=new Foo().getClass();
【c】通過(guò)Class的forName("類的全稱")。
? ? ? ? ?Class c3=Class.forName("com.imooc.reflect.Foo");
? 注意: 一個(gè)類的Class實(shí)例對(duì)象只有一個(gè),所以c1==c2==c3。
知識(shí)點(diǎn)3:類類型獲取類的實(shí)例對(duì)象。
通過(guò)一個(gè)類的Class實(shí)例對(duì)象創(chuàng)建給類的實(shí)例。
語(yǔ)法:Foo foo=(Foo)c1.newInstance()。
注意:如果c1是A類的Class實(shí)例,則創(chuàng)建的是A類的對(duì)象,如果是B類的Class實(shí)例,則創(chuàng)建的是B類的對(duì)象,并且需要做強(qiáng)制類型轉(zhuǎn)換。
前提:通過(guò)類類型調(diào)用newInstance()方法創(chuàng)建對(duì)象,前體是Foo類要有無(wú)參數(shù)的構(gòu)造方法。
【二】方法的反射
【三】成員變量的反射
【四】構(gòu)造函數(shù)的反射
【五】Java類加載機(jī)制(包括利用反射機(jī)制,在程序運(yùn)行時(shí)刻做的一些操作。java的框架如何利用反射的)
查看全部 -
先了解java反射,因?yàn)閯?dòng)態(tài)代理中,用到反射,具體如下:
動(dòng)態(tài)代理中,要執(zhí)行某個(gè)類的方法時(shí),先生成該類的代理類,通過(guò)代理類去調(diào)用目標(biāo)類的方法,從而可以在代理類中執(zhí)行 額外的邏輯。為了動(dòng)態(tài)生成代理類,而不事先生成,我們就需要利用到反射。
查看全部 -
在設(shè)計(jì)方面:
功能性的類,我們盡量去使用動(dòng)態(tài)加載,而不使用靜態(tài)加載,這樣可以使程序更加靈活
查看全部 -
A a=new A();
a是A的一個(gè)對(duì)象。
而A本身這個(gè)類也是java.lang.Class這個(gè)類的一個(gè)對(duì)象
Class c1 = A.class
或者
Class c2 = A.getClass();
c1,c2 表示A類的類類型(class type)
可以這么理解:
A作為類的時(shí)候,他就是A,
A作為對(duì)象的時(shí)候,他就是c1或者c2 ,作為Class這個(gè)類的對(duì)象。
查看全部 -
如果一個(gè)類中涉及到多個(gè)類,此時(shí)將多個(gè)類向上提取接口(眾類實(shí)現(xiàn)該接口),然后通過(guò)動(dòng)態(tài)加載類的方式在運(yùn)行的時(shí)候才創(chuàng)建對(duì)象不用的不需要編譯就不會(huì)報(bào)錯(cuò),這樣底層不需要改動(dòng),每次增加一個(gè)類實(shí)現(xiàn)該接口標(biāo)準(zhǔn)就可以也不需要編譯officebetter 只需編譯新添加的類
查看全部 -
動(dòng)態(tài)加載類
查看全部 -
new 對(duì)象的時(shí)候都是靜態(tài)加載類,即在編譯時(shí)刻就需要加載所有可能用到的類
查看全部 -
編譯,靜態(tài)加載,運(yùn)行加載,動(dòng)態(tài)加載
查看全部 -
通過(guò) 類名,全類名,以及該類對(duì)象,反射獲取該類類型,然后.newInstance() 獲取該實(shí)例
查看全部 -
Class .forName("全類名")
查看全部 -
Class c1=類名.class
Class c2=該類的對(duì)象.getClass();
c1==c2
查看全部 -
每一個(gè)類都有一個(gè)靜態(tài)成員變量 class ,任何一個(gè)類都是 Class 類的實(shí)例對(duì)象,這個(gè)對(duì)象也是該類的類類型
查看全部 -
我們創(chuàng)建的任何一個(gè)類實(shí)際上都是 java.lang.Class 類的實(shí)例對(duì)象
查看全部 -
靜態(tài)加載類,在編譯的時(shí)候就需要給所有類寫好,否則,編譯不成功;
動(dòng)態(tài)加載類,在運(yùn)行時(shí),如果沒(méi)有該類,才運(yùn)行失敗;
另外,可以通過(guò)設(shè)置接口,來(lái)接收不確定的類,通過(guò)接口來(lái)實(shí)現(xiàn)目標(biāo)類
查看全部
舉報(bào)