Java之动态代理

45 阅读2分钟

目标:学习开发出一个动态代理的对象出来,理解动态代理的执行流程

先创建一个接口Skill.java

package reflect.d8_proxy;

public interface Skill {
    void sing(); // 唱
    void dance(); // 跳
    void rap(); // Rap
}

再创建一个实体类Start.java

package reflect.d8_proxy;

public class Star implements Skill{
    private String name;
    public Star(String name) {
        this.name = name;
    }

    @Override
    public void sing() {
        System.out.println(name + "开始唱歌哩!");
    }

    @Override
    public void dance() {
        System.out.println(name + "积泥肽酶。。");
    }

    @Override
    public void rap() {
        System.out.println(name + "呗呗~~~");
    }
}

再设计一个方法来返回对象的代理对象StartAgentProxy.java

package reflect.d8_proxy;


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)
          参数:
                ①从obj对象中得到类对象,进而找到类加载器,可在底层加载代理类,最终创建一个代理对象
                ②先拿对象的类对象(Star),再拿上面的接口(Skill)
                ③写上代理的核心处理逻辑
        */

        //代理也要实现Skill接口,可以转成Skill再返回成为一个代理对象
        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;
                    }
                });
    }
}

实现类Text.java

package reflect.d8_proxy;

public class Test {
    public static void main(String[] args) {
        // 1、创建一个对象(蔡徐坤)。对象的类必须实现接口。
        Star s= new Star("蔡徐坤");
//        s.sing();
//        s.dance();
//        s.rap();

        // 为蔡徐坤对象生成一个代理对象(经纪人)
        /*
           通过经纪人的类调用方法getProxy(),并把蔡徐坤对象给入。
           会返回一个代理对象,代理对象的类型是实现了Skill接口的类型的对象
        */
        Skill s2 = StarAgentProxy.getProxy(s);
        // 通过对象s2调用方法,通过s2找代理对象
        s2.sing(); // 走代理,让代理去管
//        s2.dance();
//        s2.rap();
    }
}

注:文章内容仅供学习使用,如有冒犯,联系删除。