-
CLASS查看全部
-
動態加載類查看全部
-
new 創建對象是靜態加載類,在編譯時刻就需要加載所有可能用到的類查看全部
-
動態加載類 通過Class.forName("類的全稱")表示的Class實例不僅表示類的類類型,還代表了動態加載類(即在編譯階段不會被檢查). 通過new創建對象是靜態加載類. (即在編譯階段會檢查Java類中引用的類是否存在,但并不會執行類的加載過程,類加載需要運行階段). 靜態加載類 class office{ public static void main(string [] args) { if("Word".equals(args[0])) { Word w=new Word(); } if("Excel".equals(args[0])){ Excel e=new Excel(); } } 假設存在Word類,但不存在Excel類. 因為通過new關鍵字創建對象,屬于是靜態加載類,在編譯時刻需要檢查java類中引用到的類是否存在,語法是否合法. 若類不存在,則不能通過編譯,程序也運行也不起來. 動態加載類 若Word、Excel類實現OfficeAble接口. class office{ public static void main(string [] args) { Class c= Class.forName(args[0]); OfficeAble oa=(OfficeAble)c.newInstance(); } 動態加載類可以通過編譯,盡管Excel類、Word類都不存在也可以通過編譯. 若存在Word類,不存在Excel類,則當運行時輸入"Excel",用到Excel類才會報錯,只用Word類程序依然可以執行. 添加Excel類之后,不需要再重新編譯office這個類,即不用修改office這個類的代碼.編譯Excel類即可. 功能性的類盡量使用動態加載,而非靜態加載.查看全部
-
靜態的成員,普通數據類型類不是對象查看全部
-
Class類的表示方式(三種). 創建了一個Foo類,并且實例化對象. Foo foo1=new Foo(); 1.通過創建的Foo類的靜態成員變量class獲取Class實例.即任何一個類都有一個隱含的靜態成員變量class. Class c1=Foo.class; 2.已經知道該類的對象(該類非指Class類,而是指Class類的實例,即Foo),通過對象的getClass()方法獲取. Class c2=foo1.getClass(); 3.直接通過類名(全稱)獲取 Class c3=Class.forName("com.imooc.Foo");//會聲明異常. c1==c2==c3,它們是同一個對象.不管c1還是c2還是c3,都代表了Foo類的類類型,一個類只可能是Class類的一個實例對象. 我們可以通過類的類類型(即類的class對象)創建該類的實例對象.即可通過c1、c2、c3創建Foo的實例對象. Foo foo2=(Foo)c1.newInstance();//需要強制轉換,創建出來的是Foo類的實例對象. newInstance()方法會調用要創建的對象所對應的類的無參構造方法,所以類(Foo類)中必須要有無參的構造方法.查看全部
-
Class類 在java中靜態的成員(變量與方法)、普通數據類型類(int double)不是面向對象的,但普通數據類型類有其包裝類是面向對象的. 我們寫的每一個類,api提供的每一個類都看成是一個對象.類也是對象,類實例出來的對象也叫對象. 類是java.lang.Class類的實例對象.所有類,包括自定義的類與api提供的類都是Class類的實例對象(即任何一個類都是Class類的實例對象),即任何一個類都有且僅有一個其對應的Class對象(類類型). Class這個Java類保存的是一個Java類的meta信息(元信息)一般在反射中使用. Object類,是所有Java類的根,包括Class類. 假如自定義一個Foo類,則Foo的實例對象表示方法為:Foo foo1=new Foo();,通過new關鍵字.但Foo類本身也是一個實例對象,是Class類的實例對象. Class類有一個私有的構造方法,只有java虛擬機能實例化Class的對象.我們沒有辦法直接通過new關鍵字實例化對象.查看全部
-
Java反射機制——通過反射了解集合泛型的本質 1:反射的操作都是編譯之后的操作;就是運行階段 2:java中集合的泛型是防止錯誤輸入的;只在編譯階段有效,只要繞過編譯就無效啦 我們可以通過方法的反射來操作,繞過編譯 eg: ArrayList list1=new ArrayList(); ArrayList<String> list2=new ArrayList<String>(); Class c1=list1.getClass(); Class c2=list2.getClass(); System.out.print(c1==c2);//true Method m=c2.getMethod("add",Object.class); m.invoke(list2,20);//向list2集合中添加一個int 型的值;繞過編譯 當然是不能直接foreach list2集合的,會報類型轉換錯誤查看全部
-
!!(重點)方法的反射(作用) A a1=new A()--獲取類對象; Class c1=a1.getClass();--獲取A類的類類型 Method:/*eg,public void 對象{int a,String b} 獲取方法:Method m=c1.getMethod(方法名,參數列表(int.class,String.class/ new Class[](){int.class,String.class})) 使用方法:Object o=m.invoke(方法對象(a1),參數列表) /以前:a1.方法名(12,"cl"); 無返回使用方法:m.invoke(方法對象(a1),參數列表(12,"cl")) /*有返回值返回具體值給o,無返回值返回null//查看全部
-
Constructor:/*存儲所有構造函數到cs: Constructor[] fs=cl.getDeclaredConstructor()*/ cs.getName() /*得到構造函數名稱 cs.getParameterTypes() /*獲得參數類型->得到參數列表的類型的類類型 /*存儲所有類類型到parameter:Class[] parameter=cs[i].getParameterTypes()*/查看全部
-
Field:/*存儲所有方法到fs:Field[] fs=c1.getFields()*/ fs.getType() /*得到成員變量的類型的類類型 /*存儲所有類類型到field:Class fiedl=fs[i].getType()*/ fs.getName() /*得到成員名稱查看全部
-
反射的操作都在編譯之后的 泛型是為了避免輸入錯誤 繞過編譯就沒有效果了查看全部
-
方法的反射查看全部
-
基礎步驟查看全部
-
方法的反射查看全部
舉報
提交
取消