package staticProxy;

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

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 object) {
		this.obj = object;
		return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
	}
	//当通过代理类的对象发起对呗重写的方法调用时,都会转换为对如下的invoke方法的调用
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		Object returnVal = method.invoke(obj, args);
		return returnVal;
	}

}

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