动态代理

package com.java.exec2;

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

/**
 * Created by zhangyanana    on 2017/3/16.
 */
//动态代理的使用
interface Subject {
    void action();
}

//被代理类
class RealSubject implements Subject {

    @Override
    public void action() {
        System.out.println("我是被代理类,真正执行的是我");
    }
}
//代理类
class MyInvocationHandler implements InvocationHandler {
    Object obj;//实现了接口的被代理类的对象的声明

    //1.给被代理类的对象实例化
    //2.返回一个代理类的对象
    public Object blind(Object obj) {//传入被代理类的对象
        this.obj = obj;
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
    }
    //当通过代理类的对象发起对被重写的方法的调用时,都会转换为对如下的invoke方法的调用
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object invoke = method.invoke(obj, args);
        return invoke;
    }
}

public class TestProxy {
    public static void main(String[] args) {
        //1.被代理类对象
        RealSubject real = new RealSubject();
        //2.创建一个实现了InvocationHandler接口的类的对象
        MyInvocationHandler handler =new MyInvocationHandler();
        //3.调用blind()方法。动态的返回一个同样实现了real所在类实现的接口Subject的代理类的对象
        Object obj = handler.blind(real);
        Subject sub = (Subject)obj;//此时的sub就是代理类的对象

        sub.action();//转到对invoke()方法的调用

        //另一个例子
        NikeClothFactory nike = new NikeClothFactory();
        ClothFactory proxyCloth = (ClothFactory) handler.blind(nike);//proxyCloth即为代理类的对象
        proxyCloth.productCloth();

    }
}
原文地址:https://www.cnblogs.com/zhyn-BeHard/p/6559713.html