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