黑马程序员技术交流社区
标题:
关于代理的一些疑问
[打印本页]
作者:
hhmm665544
时间:
2014-4-10 22:29
标题:
关于代理的一些疑问
public static Object getProxy(final Object target,final Advice1 advice){
Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
/修改传入的参数
if(args != null && args.length != 0){
System.out.println(args.length);
args[0] = args[0] + "我是代理加进去的参数";
}
advice.beforeMethod(method);
Object retVal = method.invoke(target, args);
advice.afterMethod(method);
// TODO 自动生成的方法存根
return retVal;
}
}
);
return proxy;
}
复制代码
对于代理的参数一直都不太明白,target为什么一定要是接口
作者:
H._张_♂
时间:
2014-4-11 13:59
本帖最后由 H._张_♂ 于 2014-4-11 14:00 编辑
首先,说说为什么要代理。
程序中的代理:
要为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,例如。异常处理、日志、计算方法的运行时间、事务管理等
编写一个与目标类具有相同接口的代理类,代理类每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代理
如果采用工厂模式和配置文件的方式进行管理,则不需要修改客户端程序。在配置文件中配置使用目标类还是代理类,这样比较好切换。
面对代理编程,并不是必须是接口,比如有些类没有特殊的接口。我们难道就不能对他进行代理了吗?
其实,我们要对一个类代理,必须找到一个实现了该类所有方法的类,面对接口编程的好处就是即能够找到这个类,还可以大大增加程序的可扩展性,比如现在用ArrayList,以后又要改成LinkedList,如果你面对List接口编程的话,你就不会用到ArrayList的特有方法,后直接把ArrayList改成LinkedList就行了,其他都不用改。
再说你这道题,如果找不到一个接口,那你可以找个继承了你target类的子类来进行代理编程。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2