首頁 > 軟體

一文了解Java動態代理的原理及實現

2022-07-06 18:00:34

代理是指:某些場景下物件會找一個代理物件,來輔助自己完成一些工作,如明星的經紀人、買房的人找房產中介等。

代理主要是對物件的行為額外做一些輔助操作。 

如何建立代理物件:

Java中代理的代表類是:Java.lang.reflect.Proxy

Proxy提供了一個靜態方法,用於為物件產生一個代理物件返回

主類:

public class Test {
    public static void main(String[] args) {
        //1、建立一個類,物件類必須實現介面
        star s=new star("小明");
        //為小明這個明星物件生成一個代理物件(經紀人)
        skill s2=StarAgentProxy.getProxy(s);
        s2.sing();//走代理的
        s2.jump();
        
        //執行結果:
        //代理開始
        //小明開始唱歌
        //代理結束
        //代理開始
        //小明開始跳舞
        //代理結束
    }
}

明星類(物件類):

//明星類
public class star implements skill{
    private String name;
 
    public star(String name) {
        this.name = name;
    }
    //重寫方法
    public void jump(){
        System.out.println(name+"開始跳舞");
    }
    public void sing(){
        System.out.println(name+"開始唱歌");
    }
}

行為介面類:

//行為類
public interface skill {
    void jump();//跳舞
    void sing();//唱歌
}

代理類:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
 
//代理類
public class StarAgentProxy {
    //定義一個方法來返回一個明星物件的代理物件
    public static skill getProxy(star obj){
        //為小明這個物件生成一個代理物件
        /*
          public static Object newProxyInstance(ClassLoader loader,
                                          Class<?>[] interfaces, 物件實現的介面列表
                                          InvocationHandler h)
         */
        return (skill) Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("代理開始");
                        //真正的讓小明去唱歌、跳舞
                        //method==>正在呼叫的方法物件, args==>代表這個方法的引數
                        Object rs=method.invoke(obj,args);
                        System.out.println("代理結束");
                        return rs;
                    }
                });
    }
}

實現步驟:

1、必須存在介面

2、被代理的物件需要實現介面

3、使用Proxy類提供的方法得到物件的代理物件

通過代理物件呼叫方法,執行流程是什麼樣的?

1、先走向代理

2、代理可以為方法額外做一些輔助工作

3、開始真正觸發物件的方法的執行

4、回到代理中,由代理負責返回結果給方法的呼叫者

優化程式碼的關鍵步驟:

1、必須有介面,實現類要實現介面(代理通常是基於介面實現的)

2、建立一個實現類的物件,該物件為業務物件,緊接著為業務物件做一個代理物件 

動態代理的優點:

1、可以在不改變方法原始碼的情況下,實現對方法功能的增強,提高了程式碼的複用

2、簡化了程式設計工作、提高了開發效率,同時提高了軟體系統的可拓展性

3、可以為被代理物件的所有方法做代理

4、非常靈活,支援任意介面型別的實現類物件做代理,也可以直接為介面本身做代理

為任意介面型別的實現類物件做代理的框架(執行泛型)

    public static <T> T get(T obj){
        return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(),
                obj.getClass().getInterfaces(), new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        return null;
                    }
                });
    }

到此這篇關於一文了解Java動態代理的原理及實現的文章就介紹到這了,更多相關Java動態代理內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com