摘要:簡單說反射技術可以對一個類進行解剖。反射的基本步驟獲得對象,就是獲取到指定的名稱的字節(jié)碼文件對象。所以一般情況下,被反射的類,內部通常都會提供一個公有的空參數(shù)的構造函數(shù)。
定義
其實就是動態(tài)加載一個指定的類,并獲取該類中的所有的內容。 而且將字節(jié)碼文件封裝成對象,并將字節(jié)碼文件中的內容都封裝成對象,這樣便于操作這些成員。 簡單說:反射技術可以對一個類進行解剖。
反射的好處:
大大的增強了程序的擴展性。
反射的基本步驟:
獲得Class對象,就是獲取到指定的名稱的字節(jié)碼文件對象。 實例化對象,獲得類的屬性、方法或構造函數(shù)。 訪問屬性、調用方法、調用構造函數(shù)創(chuàng)建對象。
獲取這個Class對象,有三種方式:
1:通過每個對象都具備的方法getClass來獲取。弊端:必須要創(chuàng)建該類對象,才可以調用getClass方法。 2:每一個數(shù)據(jù)類型(基本數(shù)據(jù)類型和引用數(shù)據(jù)類型)都有一個靜態(tài)的屬性class。弊端:必須要先明確該類。 前兩種方式不利于程序的擴展,因為都需要在程序使用具體的類來完成。 3:使用的Class類中的方法,靜態(tài)的forName方法。 指定什么類名,就獲取什么類字節(jié)碼文件對象,這種方式的擴展性最強,只要將類名的字符串傳入即可。 // 1. 根據(jù)給定的類名來獲得 用于類加載 String classname = "cn.itcast.reflect.Person";// 來自配置文件 Class clazz = Class.forName(classname);// 此對象代表Person.class // 2. 如果拿到了對象,不知道是什么類型 用于獲得對象的類型 Object obj = new Person(); Class clazz1 = obj.getClass();// 獲得對象具體的類型 // 3. 如果是明確地獲得某個類的Class對象 主要用于傳參 Class clazz2 = Person.class;反射的用法
//需要獲得java類的各個組成部分,首先需要獲得類的Class對象,獲得Class對象的三種方式: Class.forName(classname)用于做類加載 obj.getClass()用于獲得對象的類型 類名.class 用于獲得指定的類型,傳參用 //反射類的成員方法: Class clazz = Person.class; Method method = clazz.getMethod(methodName, new Class[]{paramClazz1, paramClazz2}); method.invoke(); //反射類的構造函數(shù): Constructor con = clazz.getConstructor(new Class[]{paramClazz1, paramClazz2,...}) con.newInstance(params...) //反射類的屬性: Field field = clazz.getField(fieldName); field.setAccessible(true); field.setObject(value);
獲取了字節(jié)碼文件對象后,最終都需要創(chuàng)建指定類的對象:
創(chuàng)建對象的兩種方式(其實就是對象在進行實例化時的初始化方式): 調用空參數(shù)的構造函數(shù):使用了Class類中的newInstance()方法。 調用帶參數(shù)的構造函數(shù):先要獲取指定參數(shù)列表的構造函數(shù)對象, 然后通過該構造函數(shù)的對象的newInstance(實際參數(shù)) 進行對象的初始化。
綜上所述,第二種方式,必須要先明確具體的構造函數(shù)的參數(shù)類型,不便于擴展。
所以一般情況下,被反射的類,內部通常都會提供一個公有的空參數(shù)的構造函數(shù)。
// 如何生成獲取到字節(jié)碼文件對象的實例對象。 Class clazz = Class.forName("cn.itcast.bean.Person");//類加載 // 直接獲得指定的類型 clazz = Person.class; // 根據(jù)對象獲得類型 Object obj = new Person("zhangsan", 19); clazz = obj.getClass(); Object obj = clazz.newInstance();//該實例化對象的方法調用就是指定類中的空參數(shù)構造函數(shù),給創(chuàng)建對象進行初始化。當指定類中沒有空參數(shù)構造函數(shù)時,該如何創(chuàng)建該類對象呢?請看method_2(); public static void method_2() throws Exception { Class clazz = Class.forName("cn.itcast.bean.Person"); //既然類中沒有空參數(shù)的構造函數(shù),那么只有獲取指定參數(shù)的構造函數(shù),用該函數(shù)來進行實例化。 //獲取一個帶參數(shù)的構造器。 Constructor constructor = clazz.getConstructor(String.class,int.class); //想要對對象進行初始化,使用構造器的方法newInstance(); Object obj = constructor.newInstance("zhagnsan",30); //獲取所有構造器。 Constructor[] constructors = clazz.getConstructors();//只包含公共的 constructors = clazz.getDeclaredConstructors();//包含私有的 for(Constructor con : constructors) { System.out.println(con); } }反射指定類中的方法
//獲取類中所有的方法。 public static void method_1() throws Exception { Class clazz = Class.forName("cn.itcast.bean.Person"); Method[] methods = clazz.getMethods();//獲取的是該類中的公有方法和父類中的公有方法。 methods = clazz.getDeclaredMethods();//獲取本類中的方法,包含私有方法。 for(Method method : methods) { System.out.println(method); } } //獲取指定方法; public static void method_2() throws Exception { Class clazz = Class.forName("cn.itcast.bean.Person"); //獲取指定名稱的方法。 Method method = clazz.getMethod("show", int.class,String.class); //想要運行指定方法,當然是方法對象最清楚,為了讓方法運行,調用方法對象的invoke方法即可,但是方法運行必須要明確所屬的對象和具體的實際參數(shù)。 Object obj = clazz.newInstance(); method.invoke(obj, 39,"hehehe");//執(zhí)行一個方法 } //想要運行私有方法。 public static void method_3() throws Exception { Class clazz = Class.forName("cn.itcast.bean.Person"); //想要獲取私有方法。必須用getDeclearMethod(); Method method = clazz.getDeclaredMethod("method", null); // 私有方法不能直接訪問,因為權限不夠。非要訪問,可以通過暴力的方式。 method.setAccessible(true);//一般很少用,因為私有就是隱藏起來,所以盡量不要訪問。 } //反射靜態(tài)方法。 public static void method_4() throws Exception { Class clazz = Class.forName("cn.itcast.bean.Person"); Method method = clazz.getMethod("function",null); method.invoke(null,null); }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/73209.html
摘要:在該配置中,加入這個方法的話,表明使用了該配置的地方,就會禁用該模塊使用容災降級的功能添加訪問層添加電影微服務啟動類電影微服務,定制,一個功能禁用,另一個功能啟用。 SpringCloud(第 016 篇)電影微服務,定制Feign,一個Feign功能禁用Hystrix,另一個Feign功能啟用Hystrix - 一、大致介紹 1、在一些場景中,部分功能需要使用斷路器功能,部分功能不需...
摘要:反射機制一結合官方通過編寫的反射教程,復習一下反射的知識。反射的概念反射是一種在運行時獲取以及修改應用行為的一種工具。因為反射需要動態(tài)的解析類的信息,相比于非反射使用的方式要慢。反射需要獲取一定的運行時權限,在特定的安全環(huán)境下不一定存在。 Java反射機制(一) 結合Oracle官方通過JDK8編寫的反射教程,復習一下反射的知識。結尾篇補一個小例子。 主要內容 這次博客的主要內容就是簡...
摘要:簡介參考指南參考指南中文全文搜索引擎顧名思義,是做收索用的,因為普通的搜索在數(shù)據(jù)量小的時候,能應對自如,但是當數(shù)據(jù)量上千萬,或者上億的時候。 sphinx簡介參考指南參考指南sphinx API中文 sphinx 全文搜索引擎:顧名思義,是做收索用的,因為普通的搜索在數(shù)據(jù)量小的時候,能應對自如,但是當數(shù)據(jù)量上千萬,或者上億的時候。純粹的sql搜索顯得緩慢,無力。因而為了提高用戶體驗,增...
閱讀 2671·2023-04-26 00:42
閱讀 2817·2021-09-24 10:34
閱讀 3832·2021-09-24 09:48
閱讀 4167·2021-09-03 10:28
閱讀 2587·2019-08-30 15:56
閱讀 2783·2019-08-30 15:55
閱讀 3274·2019-08-29 12:46
閱讀 2254·2019-08-28 17:52