动态代理

代理设计模式原理

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

java动态代理api

Proxy :专门完成代理的操作类,是所有动态代理类的父类。通过此类为一个或多个接口动态地生成实现类。

静态代理示例

/**
 * 静态代理
 * 特点: 代理类和被代理类在编译期间就确定
 */
public class StaticProxyTest {
    public static void main(String[] args) {
        //创建被代理类对象
        AppleFactory apple = new AppleFactory();
        //创建代理类对象
        ProxyFoodFactory proxyFoodFactory = new ProxyFoodFactory(apple);

        proxyFoodFactory.getFood();
    }
}

//代理类
class ProxyFoodFactory implements FoodFactory {
    private FoodFactory factory;//用被代理类对象进行实例化

    public ProxyFoodFactory(FoodFactory factory) {
        this.factory = factory;
    }

    @Override
    public void getFood() {
        System.out.println("代理工厂初始化");
        factory.getFood();
        System.out.println("代理工厂结束");
    }
}
//被代理类
class AppleFactory implements FoodFactory{

    @Override
    public void getFood() {
        System.out.println("买一箱苹果");
    }
}

interface FoodFactory {
    void getFood();
}

动态代理示例

/**
 * 动态代理
 */
public class ProxyTest {
    public static void main(String[] args) {
        Male male = new Male();
        //代理类对象
        People proxyInstance = (People) ProxyFactory.getProxyInstance(male);

        //当通过代理类对象调用方法时,会自动调用被代理类中同名的方法
        String type = proxyInstance.getType();
        System.out.println(type);
        proxyInstance.like("女人");
    }

}

class Util{
    public static void method1(){
        System.out.println("-----------通用方法1------------");
    }

    public static void method2(){
        System.out.println("-----------通用方法2------------");
    }
}

class ProxyFactory{
    //通过调用此方法,返回一个代理类对象
    public static Object getProxyInstance(Object obj){//obj为被代理类对象
        MyInvocationHandler myInvocationHandler =  new MyInvocationHandler();
        myInvocationHandler.bind(obj);
        return  Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),myInvocationHandler);
    }
}

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 {
        Util.method1();//切面1
        //method为代理类对象调用的方法,此方法也就作为了被代理类对象要调用的方法
        //obj:被代理类对象
        Object invoke = method.invoke(obj, args);

        Util.method2();//切面2
        //上述方法的返回值作为invoke()的返回值
        return invoke;
    }
}

//被代理类
class Male implements People {
    @Override
    public String getType() {
        return "男性";
    }

    @Override
    public void like(String thing) {
        System.out.println("男性喜欢" + thing);
    }
}

//被代理类
class Female implements People {
    @Override
    public String getType() {
        return "女性";
    }

    @Override
    public void like(String thing) {
        System.out.println("女性喜欢" + thing);
    }
}

interface People {
    String getType();
    void like(String thing);
}
Copyright © zhaojq 2019 all right reserved,powered by Gitbook本书发布时间: 2021-01-19 20:53:29

results matching ""

    No results matching ""