代理模式--动态代理的代码实现

/**
 * 动态代理的测试
 *
 * @date 2022/05/12 16:35:53
 */
//创建一个接口
interface ClothFactory {

    void planStuff();

    void planProduce(String name);

}

//被代理类
class ClothFactoryProxy implements ClothFactory {

    @Override
    public void planStuff() {
        System.out.println("被代理类----准备材料");
    }

    @Override
    public void planProduce(String name) {
        System.out.println("被代理类----生产衣服, 品牌是:" + name);
    }
}

//AOP的应用
class ClothUtil {
    public void method1() {
        System.out.println("========================通用方法一执行========================");
    }

    public void method2() {
        System.out.println("========================通用方法二执行========================");
    }
}


//问题1:如何根据加载到内存中的被代理类对象,动态的创建一个代理类及对象
//问题2:当代理类对象调用方法a时,如何动态去调用被代理类中的同名方法a
//相当于代理类
class ProxyFactory {
    /**
     * 调用此方法,返回一个 代理类 对象,解决问题1
     *
     * @param obj 被代理类对象
     * @return java.lang.Object
     * @author 小宇宙
     * @date 2022/5/12 17:00:15
     */
    public static Object getProxy(Object obj) {
        //解决问题2
        MyInvocationHandler handler = new MyInvocationHandler(obj);
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), handler);
    }
}
class MyInvocationHandler implements InvocationHandler{
    //需要使用被代理类的对象进行赋值
    private Object object;

    public MyInvocationHandler(Object object) {
        this.object = object;
    }

    //当我们通过代理类的对象调用方法a时,就会调用此方法:invoke()
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //AOP的应用
        ClothUtil util = new ClothUtil();
        //调用通用方法一
        util.method1();

        //method: 即为代理类对象调用的方法,此方法也就作为被代理类对象要调用的方法
        //args: 为方法的参数
        //object: 被代理类的对象
        Object returnValue = method.invoke(object, args);

        //调用通用方法二
        util.method2();

        return returnValue;
    }
}



public class MovingProxyTest {

    public static void main(String[] args) {
        //创建一个被代理类对象
        ClothFactoryProxy clothFactoryProxy = new ClothFactoryProxy();
        //调用ProxyFactory的getProxy方法,返回一个 代理类对象 clothFactory
        ClothFactory clothFactory = (ClothFactory) ProxyFactory.getProxy(clothFactoryProxy);
        //当通过代理类对象调用执行方法时,会自动调用被代理类中同名的方法
        clothFactory.planStuff();
        clothFactory.planProduce("李宁");

        System.out.println("-----------------------------------------------------");

        //创建一个被代理类对象
        LiNingShoeFactory liNingShoeFactory = new LiNingShoeFactory();
        //调用方法,返回一个代理类对象shoeFactory
        ShoeFactory shoeFactory = (ShoeFactory) ProxyFactory.getProxy(liNingShoeFactory);
        shoeFactory.produceShoe();

    }

}

运行结果:
    ========================通用方法一执行========================
	被代理类----准备材料
	========================通用方法二执行========================
	========================通用方法一执行========================
	被代理类----生产衣服, 品牌是:李宁
	========================通用方法二执行========================
	********************************************************
	========================通用方法一执行========================
	被代理类====Li-Ning品牌生产一批运动鞋
	========================通用方法二执行========================

你可能感兴趣的:(代理模式,java,开发语言)