本文共 2575 字,大约阅读时间需要 8 分钟。
使用一个代理将对象包装起来, 然后用该代理对象取代原始对象。任何对原 始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原 始对象上
2.1举例:
静态代理的缺点:动态代理是指客户通过代理类来调用其它对象的方法,并且是在程序运行时 根据需要动态创建目标类的代理对象
体现为两方面的实现:
interface Human{ String getBelief(); void eat(String food);}//被代理类class SuperMan implements Human{ @Override public String getBelief() { return "I believe I can fly!"; } @Override public void eat(String food) { System.out.println("我喜欢吃" + food); }}class HumanUtil{ public void method1(){ System.out.println("====================通用方法一===================="); } public void method2(){ System.out.println("====================通用方法二===================="); }}
/*
要想实现动态代理,需要解决的问题? 问题一:如何根据加载到内存中的被代理类,动态的创建一个代理类及其对象。 问题二:当通过代理类的对象调用方法a时,如何动态的去调用被代理类中的同名方法a。*/class ProxyFactory{ //调用此方法,返回一个代理类的对象。解决问题一 public static Object getProxyInstance(Object obj){ //obj:被代理类的对象 MyInvocationHandler handler = new MyInvocationHandler(); handler.bind(obj);// static Object newProxyInstance(ClassLoader loader, 类 [] interfaces,// InvocationHandler h) 返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序 return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),handler); }}class MyInvocationHandler implements InvocationHandler { private Object obj;//需要使用被代理类的对象进行赋值 public void bind(Object obj){ this.obj = obj; } //当我们通过代理类的对象,调用方法a时,就会自动的调用如下的方法:invoke()(处理代理实例上的方法调用并返回结果 //将被代理类要执行的方法a的功能就声明在invoke()中 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { HumanUtil humanUtil = new HumanUtil(); humanUtil.method1(); //method:即为代理类对象调用的方法,此方法也就作为了被代理类对象要调用的方法 //obj:被代理类的对象 Object returnValue = method.invoke(obj, args); humanUtil.method2(); //上述方法的返回值就作为当前类中的invoke()的返回值。 return returnValue; }}public class DynamicProxyTest { public static void main(String[] args) { SuperMan superMan = new SuperMan(); //proxyInstance:代理类的对象 Human proxyInstance = (Human) ProxyFactory.getProxyInstance(superMan); String belief = proxyInstance.getBelief(); System.out.println(belief); proxyInstance.eat("火锅"); System.out.println("******************"); NikeClothFactory nike = new NikeClothFactory(); ClothFactory proxyInstance1 =(ClothFactory) ProxyFactory.getProxyInstance(nike); proxyInstance1.produceCloth(); }}
体会:反射的动态性。
转载地址:http://wtuki.baihongyu.com/