1. 程式人生 > 實用技巧 >JAVA反射的簡單理解

JAVA反射的簡單理解

JAVA 反射有物件反射和方法反射

主要使用者解耦框架的研發,由於沒有接觸過框架的開發,因此不能理解物件反射和方法反射具體產生了什麼樣的作用

個人理解:物件反射和方法反射,不再是以前的new操作,以Person類舉例

以前獲取物件: Person person = new Person();

反射方式獲取物件:Person object = (Person)Class.forName('Person').newInstance();

通常獲取呼叫方法: person.sayHello("張三");

反射方式呼叫方法: Method method = object.getClass().getMethod("sayHello", String.class);

method.invoke(object, "張三");

看上去我們的呼叫更加不便捷,但是解耦的思想是:程式碼中取消固定的類的依賴,採用配置等方式解耦,一旦我們需要改動,即改動配置檔案或少量配置即可,而不用一個類裡面大量修改new的物件,

這個時候,反射就很好用了,他的類名等都是可以通過配置檔案載入的

例舉:

Properties pro=new Properties();
//獲取class目錄下的配置檔案

pro.load(ReflectionText.class.getClassLoader().getResourceAsStream("application.properties"));
//獲取配置檔案定義的資料
String className=pro.getProperty("className");
String methodName=pro.getProperty("methodName");
//載入該類進記憶體
Class cls = Class.forName(className);
//執行方法
cls.getMethod(methodName).invoke(cls.newInstance());

------------------------------------------------------------------------------------------------------------------------------------------

動態代理模式的產生
如果僅僅是通過反射的方式使用類,我們會發現建立起來十分繁瑣,且只能直接呼叫反射好的方法,我理解動態代理模式其實是反射的更加便捷的封裝,其有兩大特點
1.同樣繼承了反射的思想,是反射的更好的封裝
2.可以在呼叫方法之前和方法之後處理自己的邏輯,例如:基於一個特別的規則,方法就不會被呼叫了,而這部分邏輯不需要在類裡面實現,是通過先於類呼叫做到了攔截
動態代理的思想是:建立一個代理物件,該物件和實際物件是對映的,使用者在使用的時候,通過代理物件呼叫實際物件的方法,同時,代理物件也可以在自己內部做邏輯處理
動態代理模式有兩種:
1.JDK模式
JDK代理模式要求必須提供接口才能使用
JDK動態代理實現:

2.GCLiB模式
GCLIB則在沒有提供介面的情況下使用,需要提供一個非虛擬類