Java高級特性基礎(chǔ)之反射五連問
1.反射的作用
它賦予了我們在運(yùn)行時(shí)分析類以及執(zhí)行類中方法的能力。通過反射你可以獲取任意一個(gè)類的所有屬性和方法,你還可以調(diào)用這些方法和屬性
2.反射的優(yōu)缺點(diǎn)
反射讓我們在運(yùn)行時(shí)有了分析操作類的能力,反射可以讓我們的代碼更加靈活、為各種框架提供開箱即用的功能提供了便利。
增加了安全問題,比如可以無視泛型參數(shù)的安全檢查(泛型參數(shù)的安全檢查發(fā)生在編譯時(shí))
另外,反射的性能也要稍差點(diǎn),不過,對于框架來說實(shí)際是影響不大的
3.反射的應(yīng)用場景
Spring/Spring Boot、MyBatis 等等框架中都大量使用了反射機(jī)制
Java動(dòng)態(tài)代理的實(shí)現(xiàn)也依賴反射
Java 中的一大利器 注解 的實(shí)現(xiàn)也用到了反射
4.說一下反射的相關(guān)類有哪些
/** * 反射入門 * 通過字符串形式的類的路徑和方法信息調(diào)用類的方法 */ public class reflectionTest { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException { // 類的路徑 String classPath = "reflection.Cat"; // 要執(zhí)行類的方法名稱 String classMethod = "hi"; // 加載類 Class cls = Class.forName(classPath); // 通過cls得到你加載的類Cat的對象實(shí)例 Object o = cls.newInstance(); // 查看o的運(yùn)行類型,為Cat類型 System.out.println(o.getClass()); // class reflection.Cat // 得到加載的類的方法對象 // 在反射中,可以把方法視為對象 Method method = cls.getMethod(classMethod); // 通過method實(shí)例調(diào)用方法:即通過方法對象來實(shí)現(xiàn)調(diào)用方法 method.invoke(o); // 喵喵喵~ // 得到name字段的信息 // 注意:getField不能得到私有的屬性信息 Field nameField = cls.getField("name"); System.out.println(nameField.get(o)); // 豹貓(我們定義的屬性名字) // 得到構(gòu)造器 Constructor constructor = cls.getConstructor(); System.out.println(constructor); // public reflection.Cat() } }
5.獲取Class對象的六種方式
forName獲取。多用于配置文件讀取類的全路徑,加載類
String classAllPath = "reflection.Cat"; Class ccls = Class.forName(classAllPath);
類名.class。多用于參數(shù)傳遞
System.out.println(String.class); // class java.lang.String System.out.println(Cat.class); // class reflection.Cat
對象.getClass。適用于已經(jīng)存在對象實(shí)例的情況
Cat cat = new Cat(); System.out.println(cat.getClass()); // class reflection.Cat
通過類加載器獲取Class對象,通過類加載器獲取 Class 對象不會(huì)進(jìn)行初始化,意味著不進(jìn)行包括初始化等一系列步驟,靜態(tài)代碼塊和靜態(tài)對象不會(huì)得到執(zhí)行
String classAllPath = "reflection.Cat"; Cat cat = new Cat(); // (1)得到類加載器 ClassLoader classLoader = cat.getClass().getClassLoader(); // (2)通過類加載器得到Class對象 Class<?> cls = classLoader.loadClass(classAllPath); System.out.println(cls); // class reflection.Cat
基本數(shù)據(jù)類型通過.class獲取Class對象
Class<Integer> integerClass = int.class; Class<Character> characterClass = char.class; Class<Boolean> booleanClass = boolean.class; System.out.println(integerClass); // int
基本數(shù)據(jù)類型的包裝類可以通過.TYPE得到Class對象
Class<Integer> type = Integer.TYPE; System.out.println(type); // int
到此這篇關(guān)于Java高級特性基礎(chǔ)之反射五連問的文章就介紹到這了,更多相關(guān)Java高級特性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java HttpClient執(zhí)行請求時(shí)配置cookie流程詳細(xì)講解
這篇文章主要介紹了Java HttpClient執(zhí)行請求時(shí)配置cookie流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-02-02Spring boot + LayIM + t-io 實(shí)現(xiàn)文件上傳、 監(jiān)聽用戶狀態(tài)的實(shí)例代碼
這篇文章主要介紹了Spring boot + LayIM + t-io 實(shí)現(xiàn)文件上傳、 監(jiān)聽用戶狀態(tài)的實(shí)例代碼,需要的朋友可以參考下2017-12-12JAVA實(shí)現(xiàn)數(shù)字大寫金額轉(zhuǎn)換的方法
這篇文章主要介紹了JAVA實(shí)現(xiàn)數(shù)字大寫金額轉(zhuǎn)換的方法,涉及java針對字符串與數(shù)組的遍歷與轉(zhuǎn)換相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07springboot與數(shù)據(jù)庫返回?cái)?shù)據(jù)中文亂碼
大家好,本篇文章主要講的是springboot與數(shù)據(jù)庫返回?cái)?shù)據(jù)中文亂碼,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽2022-01-01Java實(shí)現(xiàn)多任務(wù)執(zhí)行助手
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)多任務(wù)執(zhí)行助手,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08