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();
}
}