代理设计模式之动态代理

何为Java代理

Java代理是一种设计模式----代理设计模式
其定义为:使用一个代理将对象包装起来,然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。
用简单粗暴的话说,就是你要做的事情由你的经纪人代你完成 或者说 替身攻击

何为动态代理

提到动态代理,与其对应的则是静态代理,静态代理的特征是代理类和被代理类都是在编译时就确定下来的,不利于程序的扩展。
而动态代理着重于动态,而相较于静态代理的写死,动态代理则能够更加灵活统一的处理众多方法

代理的简单规则

代理类和被代理类都要实现同一接口

要想实现动态代理,需要解决的两个问题

1.如何根据加载到内存中的被代理类,动态的创建一个代理类及其对象

2.当通过代理类的对象调用方法时,如何动态的去调用被代理类中同名的方法

下面通过代码来让我们体会一下动态代理

// 定义一个接口 
interface Human {
    void hit();
    String say(String say);
}
// 定义被代理类 定义两个需要“替身攻击”的方法
class MovieStar implements Human {

    @Override
    public void hit() {
        System.out.println("乌鸦坐飞机");
    }

    @Override
    public String say(String say) {
        return say;
    }
}
// 定义代理工厂,动态的产出代理类
class ProxyFactory {
    // 调用此方法,返回一个代理对象,解决问题1
    public static Object getProxyInstance(Object obj) { // obj 被代理对象
        // 这里的Proxy.newProxyInstance需要传入三个参数,1.被代理对象的类加载器 2.被代理对象实现的接口, 3.InvocationHandler接口
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        return method.invoke(obj, args);
                    }
                });
    }
}
// 测试类
public class ProxyTest {
    public static void main(String[] args) {
        MovieStar movieStar = new MovieStar();
        Human proxyInstance = (Human) ProxyFactory.getProxyInstance(movieStar);
        proxyInstance.hit();
        System.out.println(proxyInstance.say("老鼠走迷宫"));
    }
}

此时,你的替身就能替你做出"乌鸦坐飞机",替你say "老鼠走迷宫"

posted @ 2021-02-24 18:38  Lethex  阅读(48)  评论(2编辑  收藏  举报