引入泛型的目的
通過泛型使得在編譯階段完成一些類型轉(zhuǎn)換的工作,避免在運行時強制類型轉(zhuǎn)換而出現(xiàn)ClassCastException翠储,即類型轉(zhuǎn)換異常。
優(yōu)點
在編譯的時候檢查類型安全橡疼,并且所有的強制轉(zhuǎn)換都是自動和隱式的援所,提高代碼的重用率。
1欣除,類型安全住拭。 泛型的主要目標是提高 Java 程序的類型安全。通過知道使用泛型定義的變量的類型限制历帚,編譯器可以在一個高得多的程度上驗證類型假設(shè)滔岳。沒有泛型,這些假設(shè)就只存在于程序員的頭腦中(或者如果幸運的話挽牢,還存在于代碼注釋中)谱煤。
2,消除強制類型轉(zhuǎn)換禽拔。 泛型的一個附帶好處是刘离,消除源代碼中的許多強制類型轉(zhuǎn)換室叉。這使得代碼更加可讀,并且減少了出錯機會硫惕。
3茧痕,潛在的性能收益。 泛型為較大的優(yōu)化帶來可能疲憋。在泛型的初始實現(xiàn)中凿渊,編譯器將強制類型轉(zhuǎn)換(沒有泛型的話,程序員會指定這些強制類型轉(zhuǎn)換)插入生成的字節(jié)碼中缚柳。但是更多類型信息可用于編譯器這一事實埃脏,為未來版本的 JVM 的優(yōu)化帶來可能。由于泛型的實現(xiàn)方式秋忙,支持泛型(幾乎)不需要 JVM 或類文件更改彩掐。所有工作都在編譯器中完成,編譯器生成類似于沒有泛型(和強制類型轉(zhuǎn)換)時所寫的代碼灰追,只是更能確保類型安全而已堵幽。
Java反射機制定義
Java反射機制是在運行狀態(tài)中,對于任意一個類弹澎,都能夠知道這個類中的所有屬性和方法朴下;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性苦蒿;這種動態(tài)獲取的信息以及動態(tài)調(diào)用對象的方法的功能稱為java語言的反射機制殴胧。
1.通過完整包名和類名獲取類的Class對象clazz;
2.通過Class對象clazz獲取它的構(gòu)造函數(shù),屬性和方法所對應(yīng)的Constructor對象佩迟,F(xiàn)iled對象和Method對象团滥。【getConstructors()报强、getMethods()灸姊、getFields()】
3.通過Class對象clazz生成類的實例對象obj”龋【newInstance()】
4.反射調(diào)用方法力惯。【Method.invoke(Object obj, Object... args)】
Class clazz = Class.forName("com.yolo.Person");
Constructor constructor = clazz.getConstructor(null);
// 獲得與該方法對應(yīng)的Method對象
Method methodSetName = clazz.getDeclaredMethod("setName", String.class);
Method methodGetName = clazz.getDeclaredMethod("getName");
// 獲得與該屬性對應(yīng)的Filed對象
Field field = clazz.getDeclaredField("name");
Field fieldAge = clazz.getDeclaredField("age");
// 實例化Person對象
Person p = (Person) clazz.newInstance();
Person p1 = (Person) constructor.newInstance();
// 調(diào)用指定的函數(shù)并傳遞參數(shù)
methodSetName.invoke(p, "tracelss");
methodGetName.invoke(p);
// 訪問成員變量坚嗜,如果是基礎(chǔ)數(shù)據(jù)類型夯膀,則使用setXXX/getXXX形式的方法,否則直接使用set/get
field.set(p, "xin");
fieldAge.setInt(p, 18);