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