Java动态代理与常规代理的有用性
2022-09-04 01:14:50
我需要一些建议,对于动态代理在哪些情况下比常规代理更有用。
我花了很多精力来学习如何有效地使用动态代理。在这个问题上,撇开像AspectJ这样的框架基本上可以执行我们试图通过动态代理实现的所有事情,或者例如,CGLIB可以用来解决动态代理的一些缺点。
使用案例
- 装饰器 - 例如,在方法调用时执行日志记录,或缓存复杂操作的返回值
- 维护协定 - 即,确保参数在可接受的范围内,并且返回类型符合接受的值。
- 适配器 - 在某处看到了一些聪明的文章,描述了这如何有用。不过,我很少遇到这种设计模式。
其他人是吗?
动态代理优势
- 装饰器:记录所有方法调用,例如
public Object invoke(Object target, Method method, Object[] arguments) {
System.out.println("before method " + method.getName());
return method.invoke(obj, args);
}
}
装饰器模式绝对有用,因为它允许对所有代理方法产生副作用(尽管此行为是使用方面的书籍示例..)。
- Contract:与常规代理相比,我们不需要实现完整的接口。例如,
public Object invoke(Object target, Method method, Object[] arguments) {
if ("getValues".equals(method.getName()) {
// check or transform parameters and/or return types, e.g.,
return RangeUtils.validateResponse( method.invoke(obj, args) );
}
if ("getVersion".equals(method.getName()) {
// another example with no delegation
return 3;
}
}
另一方面,合约只提供了避免实现完整接口的需要的好处。再说一次,重构代理方法会以静默方式使动态代理失效。
结论
所以我在这里看到的是一个真正的用例,一个可疑的用例。你怎么看?