反射定義
JAVA反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱爲java語言的反射機制。 1. 理解反射的概念,反射之中包含了一個「反」字,因此瞭解反射咱們先從「正」開始。 1.1)通常狀況下,咱們使用某個類時一定知道它是什麼類,是用來作什麼的。因而咱們直接對這個類進行實例化,以後使用這個類對象進行操做。 1.2)反射則是一開始並不知道我要初始化的類對象是什麼(或者是第三方的類沒有提供對外的構造方法等狀況),天然也沒法使用 new 關鍵字來建立對象了。這時候,咱們使用 JDK 提供的反射 API 進行反射調用 測試類:java
ppackage animal; public class Dog { private String name; private int age; private Dog() { this.name = "dav"; this.age = 2; } public Dog(String name) { this.name = name; } public Dog(String name, int age) { this.name = name; this.age = age; } public void eat(String food) { System.out.println("dog " + name + " eat " + food); } private void sleep(int hours) { System.out.println("dog " + name + " sleep " + hours + " hours"); } }
反射的相關操做 緩存
代理模式定義
給目標對象提供一個代理對象,並由代理對象控制對目標對象的引用。目的: (1)經過引入代理對象的方式來間接訪問目標對象,防止直接訪問目標對象給系統帶來的沒必要要複雜性。 (2)經過代理對象對原有的業務加強。 測試
- 靜態代理 一個代理對象和真實對象 存在一個肯定關係(一對一 或者 一對多)便是代理對象中的真實對象是肯定的。(違反開閉原則,擴展能力差,可維護性差)
- 動態代理:是指在使用時再建立代理類和實例 1)優勢:只須要1個動態代理類就能夠解決須要建立多個靜態代理才能處理的問題,避免重複、多餘代碼,更強的靈活性 2)缺點:效率低,相比靜態代理中 直接調用目標對象方法,動態代理則須要先經過Java反射機制,從而間接調用目標對象方法。 3)應用場景侷限:由於 Java 的單繼承特性(每一個代理類都繼承了 Proxy 類),即只能針對接口 建立 代理類,不能針對類建立代理類。在java的動態代理機制中,有兩個重要的類或接口,一個是InvocationHandler接口、另外一個則是 Proxy類,這個類和接口是實現咱們動態代理所必須用到的。 InvocationHandler接口是給動態代理類實現的,負責處理被代理對象的操做的,而Proxy是用來建立動態代理類實例對象的,由於只有獲得了這個對象咱們才能調用那些須要代理的方法。
4)動態代理實現原理: 經過 Proxy.newProxyInstance()方法動態生成一個代理類(這個動態生成的代理類 實現是被代理類 實現的接口),並緩存。用戶獲取到這個代理類後 調用接口中的方法會走到 invoke 方法中,最後由被代理類的具體實現類來操做方法。(因此動態代理類中須要實現invocationHandler接口,並完成invoke方法的反射調用) 5)實現範例 this