java的反射和動態代理

反射定義

JAVA反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意方法和屬性;這種動態獲取信息以及動態調用對象方法的功能稱爲java語言的反射機制。 1. 理解反射的概念,反射之中包含了一個「反」字,因此瞭解反射咱們先從「正」開始。 1.1)通常狀況下,咱們使用某個類時一定知道它是什麼類,是用來作什麼的。因而咱們直接對這個類進行實例化,以後使用這個類對象進行操做。 image.png 1.2)反射則是一開始並不知道我要初始化的類對象是什麼(或者是第三方的類沒有提供對外的構造方法等狀況),天然也沒法使用 new 關鍵字來建立對象了。這時候,咱們使用 JDK 提供的反射 API 進行反射調用 image.png 測試類: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)經過代理對象對原有的業務加強。 image.png測試

  • 靜態代理 一個代理對象和真實對象 存在一個肯定關係(一對一 或者 一對多)便是代理對象中的真實對象是肯定的。(違反開閉原則,擴展能力差,可維護性差) 公共接口 真實對象 代理對象 訪問者
  • 動態代理:是指在使用時再建立代理類和實例 1)優勢:只須要1個動態代理類就能夠解決須要建立多個靜態代理才能處理的問題,避免重複、多餘代碼,更強的靈活性 2)缺點:效率低,相比靜態代理中 直接調用目標對象方法,動態代理則須要先經過Java反射機制,從而間接調用目標對象方法。 3)應用場景侷限:由於 Java 的單繼承特性(每一個代理類都繼承了 Proxy 類),即只能針對接口 建立 代理類,不能針對類建立代理類。在java的動態代理機制中,有兩個重要的類或接口,一個是InvocationHandler接口、另外一個則是 Proxy類,這個類和接口是實現咱們動態代理所必須用到的。 InvocationHandler接口是給動態代理類實現的,負責處理被代理對象的操做的,而Proxy是用來建立動態代理類實例對象的,由於只有獲得了這個對象咱們才能調用那些須要代理的方法。

4)動態代理實現原理: 經過 Proxy.newProxyInstance()方法動態生成一個代理類(這個動態生成的代理類 實現是被代理類 實現的接口),並緩存。用戶獲取到這個代理類後 調用接口中的方法會走到 invoke 方法中,最後由被代理類的具體實現類來操做方法。(因此動態代理類中須要實現invocationHandler接口,並完成invoke方法的反射調用) 5)實現範例 公共接口1 公共接口2 接口2的真實實現 接口1的真實實現 動態代理類實現 動態代理的使用this

相關文章
相關標籤/搜索