和前面部分比较,主要是代理类建立对象,和动态调用方法不同 。
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);
}
}