使用一个代理对象将对象包装起来,然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理,代理对象决定是否以及何时将方法调用转到原始对象上。
静态代理
代理类和被代理类在编译期间,就确定下来了
interface clothFactory{void productCloth();}//代理类class proxyClothFac implements clothFactory{private clothFactory clothFactory;public proxyClothFac(clothFactory clothFactory) {this.clothFactory=clothFactory;}@Overridepublic void productCloth() {System.out.println("代理工厂 start..");clothFactory.productCloth();System.out.println("代理工厂 end..");}}//被代理类class nikeFactory implements clothFactory{@Overridepublic void productCloth() {System.out.println("nike生产衣物");}}public class staticProxy {public static void main(String[] args) {//被代理类对象nikeFactory nikeFactory = new nikeFactory();//创建代理类对象proxyClothFac proxyClothFac = new proxyClothFac(nikeFactory);proxyClothFac.productCloth();}}
动态代理
代理类一开始不知道自己真实代理的对象,当首次使用代理类时传入需要代理的对象(实现动态代理)
interface human{void eat(String food);}//被代理类class superMan implements human{@Overridepublic void eat(String food) {System.out.println(food+"好吃");}}//代理类class proxyFactory{//调用方法 返回一个代理类对象public static Object getProxyInstance(Object obj){myInvokeHandler handler = new myInvokeHandler();handler.bind(obj);return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),handler);}}//实际调用方法的地方class myInvokeHandler implements InvocationHandler{private Object obj;public void bind(Object obj){this.obj=obj;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//代理类对象调用的方法System.out.println("代理类对象方法调用");return method.invoke(obj, args);}}public class dynamicProxy {public static void main(String[] args) {superMan superMan = new superMan();//当通过创建代理类对象时 实现的是它们共同的接口(类似于匿名内部类)//传入真实需要代理的对象human proxyInstance = (human) proxyFactory.getProxyInstance(superMan);proxyInstance.eat("牛肉干");//动态调用前面静态代理中的方法clothFactory proxyInstance1 = (clothFactory) proxyFactory.getProxyInstance(new nikeFactory());proxyInstance1.productCloth();}}
