Object Dynamic proxies (二) 对象动态代理

时间:2022-04-28 16:07:41

和前面部分比较,主要是代理类建立对象,和动态调用方法不同 。

     1、代理类用DynamicProxyHandler 类代替

         相同点:manufacturer的对象都传入到相应类中。

     不同的是:1》这里面不用重写接口的方法,而是实现InvocationHandler接口

                      2》重写 invoke() 方法,当执行cosumer(proxy); iface.doSell(),会自动执行 invoke()方法,

                           传入调用的对象,方法名,所有的参数,

                           进行 method.invoke(proxied, args); 的调用, proxied:就是原来的对象:即转入到生产商的操作。

                     3》建立代理对象不一样,

                         前面是new 代理类

                        这个类是通过Java自带的 Proxy.newProxyInstance 建立对象

Proxy.newProxyInstance(
InterfaceSell.class.getClassLoader(), //装入接口类进内存
new Class[]{InterfaceSell.class},       // 建立 Class 的 类对象 InterfaceSell 。
new DynamicProxyHandler(man));   // 这个建立DynamicProxyHandler  实例,并传入生产商对象,这部分和前面代理类差不多。

package ftypeinfo;


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


class DynamicProxyHandler implements InvocationHandler{
private Object proxied;
public DynamicProxyHandler(Object proxied)
{this.proxied=proxied;}

@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
System.out.println("*******proxy:"+proxy.getClass()+
",method:"+method+",args:"+args);
if (args!=null)
 for(Object arg:args)
   System.out.println(" "+arg);
return method.invoke(proxied, args);
}
}

public class SimpleDynamicProxy {


public static void cosumer(InterfaceSell iface)
{
iface.doSell();
iface.somethingElse("bonobo");
}  

public static void main(String[] args) {
// TODO Auto-generated method stub
manufacturer man=new manufacturer();
cosumer(man);
//建立对象动态,调用方法动态
InterfaceSell proxy=(InterfaceSell)Proxy.newProxyInstance(
InterfaceSell.class.getClassLoader(),
new Class[]{InterfaceSell.class},
new DynamicProxyHandler(man));
cosumer(proxy);
}


}