什么是代理
给某一个对象提供一个代理,以此来控制对这个对象的访问。
委托类和代理类有着共同的父类或者是父接口,这样的话,在任何使用委托类对象的地方都能够用代理对象来替代。
代理类负责请求的预处理、过滤、把请求分派给委托类处理、以及委托类执行完请求后的后续处理。
① 静态代理
由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。
静态代理让调用者不用再直接持有操作者的引用,而是将一切操作交由代理者去完成。但是静态代理也有它的局限性:
- 如果需要增加一个需要代理的方法,代理者的代码也必须改动进而适配新的操作;
- 如果需要代理者代理另外一个操作者,同样需要对代理者进行扩展并且更加麻烦。
② 动态代理
在程序运行时运用反射机制动态创建而成,动态代理能够在自定义调用处理器统一处理委托类的方法,而不需要去一个个进行编写。
但是,动态代理也存在这个一个很明显的缺点。
动态代理只可以代理基于接口的类,而不能去代理没有接口的委托类。
一个栗子
public <T> T create(final Class<?> interfaceClass, final String serviceVersion) {
// 使用 CGLIB 动态代理机制
Enhancer enhancer = new Enhancer();
enhancer.setClassLoader(interfaceClass.getClassLoader());
enhancer.setSuperclass(interfaceClass);
enhancer.setCallback(new MethodInterceptor() {
/**
* @param o 被代理的对象(需要增强的对象)
* @param method 被拦截的方法(需要增强的方法)
* @param args 方法入参
* @param methodProxy 用于调用原始方法
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
...
}
});
return (T) enhancer.create();
}
字数:1221
发布于 1 个月前