0
点赞
收藏
分享

微信扫一扫

【Java笔记】反射 - 代理模式与动态代理

目录

代理模式的原理

动态代理

动态代理的使用场合

动态代理相比于静态代理的优点

静态代理举例

动态代理举例


代理模式的原理

使用一个代理类将对象包装起来,然后用该代理对象取代原始对象,任何对原始对象的调用都要通过代理。代理对象决定是否以及何时调用转到原始对象上

动态代理

动态代理是指客户通过代理类来调用其它对象的方法,并且是在程序运行时根据需要动态创建目标类的代理对象

动态代理的使用场合

调试与远程方法调用

动态代理相比于静态代理的优点

抽象角色中(接口)声明的所有方法都能被转移到调用处理器一个集中的方法中处理,这样,我们可以更加灵活和统一的处理众多的方法

静态代理举例

interface ClothFactory{
    public void produceCloth();
}
public class ProxyTest {
    public static void main(String[] args) {
        //创建被代理类的对象
        ClothFactory nike = new NikeClothFactory();
        //创建代理类对象
        ClothFactory proxy = new Factory(nike);
        proxy.produceCloth();
    }
}
//代理类
class Factory implements ClothFactory {
    private ClothFactory factory;

    public Factory(ClothFactory factory) {
        this.factory = factory;
    }
    @Override
    public void produceCloth() {
        System.out.println("开始生产");
        factory.produceCloth();
    }
}
//被代理类
class NikeClothFactory implements ClothFactory{
    @Override
    public void produceCloth() {
        System.out.println("Nike生产");
    }
}

>>> 开始生产
    Nike生产

动态代理举例

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface Human{
    String getBelief();
    void eat(String food);
}
public class ProxyTest {
    public static void main(String[] args) {
        Human man = new Man();
        Human proxyInstance = (Human) ProxyFactory.getProxyInstance(man);
        String belief = proxyInstance.getBelief();
        System.out.println(belief);
    }
}
//被代理类
class Man implements Human{

    @Override
    public String getBelief() {
        return "I can!";
    }

    @Override
    public void eat(String food) {
        System.out.println("我爱吃:" + food);
    }
}
class ProxyFactory{
    public static Object getProxyInstance(Object obj){//obj:被代理类对象
        MyInvocationHandler handler = new MyInvocationHandler();
        handler.bind(obj);
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),handler);
    }
}
class MyInvocationHandler implements InvocationHandler{
    private Object obj;
    public void bind(Object obj){
        this.obj = obj;
    }
    //当我们通过代理类的对象,调用方法a时,就会自动的调用如下的方法:invoke()
    //将被代理类要执行的方法a的功能声明在 invoke() 中
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //method:即为代理类对象调用的方法,此方法也就作为了被代理类对象要调用的方法
        Object returnVal = method.invoke(obj, args);
        //上述方法的返回值就作为当前类中的 invoke() 的返回值
        return returnVal;
    }
}

>>> I can!
举报

相关推荐

0 条评论