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