首页 > 代码库 > 关于动态代理
关于动态代理
---恢复内容开始---
动态代理是相对于静态代理来说的,相比于后者,前者能够增强代码的复用性,可以处理一类对象。
动态代理两种分别是JDK动态代理和Cglib动态动态代理:
前者要求代理类对象和委托类实现相同的接口,否则不能生成代理对象,而且指定方法较为麻烦。代码如下:
public class Proxy{
//获取代理对象的静态方法
public static Object getProxy(final Object target , final TranactionManager tx){
//利用target参数获取类加载器,真实对象类上的接口和指定接口,创建代理对象
Object proxy = Proxy.NewInstance(target.getClass().getClassLoader , target.getClass().getInterfaces() , new InvocationHandler( ){
//当与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法
@override
public Object invoke(Object proxy,Method method , Object[] args) throws throwable{
tx.begin();
method.invoke(target,args);
tx.commit();
}
});
return proxy;
}
}
后者不管有无接口都可以实现代理对象,生成的代理对象时目标对象的子类
public class DynamicProxy {
//获取代理对象
public static Object getProxy(final Object target,final TranactionManager tx){
//增强器 底层操作的是二进制码
Enhancer enhancer = new Enhancer();
//设置接口
enhancer.setInterfaces(target.getClass().getInterfaces());
//设置父类
enhancer.setSuperclass(target.getClass());
//创建代理对象
return enhancer.create();
//设置回调 代理对象调用方法时,此方法进行拦截,进入到此方法中
//当与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodProxy) throws Throwable {
tx.begin();
//调用真实对象的方法
Object result = method.invoke(target, args);
tx.commit();
return result;
}
});
}
}
---恢复内容结束---
关于动态代理