1.Cglib动态代理

目标类:

 package cn.happy.proxy.cglib;

 public class Service {
public Service() {
System.out.println("创建Service对象");
} public void doWordk(){
System.out.println("do something");
}
}

测试:

 package cn.happy.proxy.cglib;

 import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; public class CglibTest {
public static void main(String[] args) {
//对方法增强。开闭原则-对修改关闭,对添加放开
//1.创建一个目标对象
Service service=new Service();
//2.Enhancer对象
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(service.getClass());
//3.调度setCallBack()
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("write log");
methodProxy.invoke(service,objects);
return null;
}
});
//4.Enhancer对象的Create()方法创建代理
Service proxy =(Service) enhancer.create();
//5.执行代理方法
proxy.doWordk();
}
}

测试结果:

测试第27行enhancer.create()方法调用了Service的构造器。

create()方法是生成代理对象,其本质是目标类的子类实例,所以会调用父类构造。

2.JDK动态代理

jdk动态代理原理是动态生成目标对象实现接口的实现类。

接口:

 package cn.happy.proxy.jdk;

 public interface IService {
public void doWordk();
}

目标类:

 package cn.happy.proxy.jdk;

 public class ServiceImpl implements IService{
public ServiceImpl() {
System.out.println("创建Service对象");
}
@Override
public void doWordk(){
System.out.println("do something");
}
}

测试:

 package cn.happy.proxy.jdk;

 import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; public class JdkTest {
public static void main(String[] args) {
ServiceImpl service = new ServiceImpl();
IService proxy = (IService)Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("write log");
method.invoke(service, args);
return null;
}
});
proxy.doWordk();
}
}

测试结果:

3.比较

这里从网上摘了点儿东西

JDK动态代理:代理类和目标类必须实现相同的接口,客户端通过代理类来调用目标方法,代理类会将所有的方法调用分派到目标对象上反射执行,还可以在分派过程中添加"前置通知"和后置处理。

CGLIB动态代理:动态生成一个要代理类的子类,子类重写要代理的类的所有不是final的方法。在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。它比使用java反射的JDK动态代理要快。

最新文章

  1. TestNG 与 Junit的比较
  2. SharePoint 2016 图文安装教程
  3. js实现图片加载特效(从左到右,百叶窗,从中间到两边)
  4. poj 2060 Taxi Cab Scheme (二分匹配)
  5. Dijkstra 算法、Kruskal 算法、Prim算法、floyd算法
  6. 剑指offer系列32-----对称二叉树的判断
  7. 奇异秀App:奇异秀秀奇异,用大头视频来拜年
  8. .NET Core跨平台开发
  9. ASPNET异步删除和增加
  10. Task和backStack(本篇章核心)
  11. Thrift序列化与反序列化的实现机制分析
  12. Why choose Nexiq USB-link 125032 Diesel Truck Diagnose
  13. Java马士兵高并发编程视频学习笔记(二)
  14. js静态方法与实例方法定义,js回调方法定义
  15. U3D外包公司:Ruby的未来
  16. 【python】参数中的*args和**kwargs
  17. Android中用文件初始化sqlite 数据库(二)
  18. How to view assertions in the Verdi waveform viewer
  19. 3月26 document的练习
  20. learning shell display alert function

热门文章

  1. Theano 编程核心
  2. Windows Presentation Foundation (WPF)中的命令(Commands)简述
  3. WPF XAML中 Storyboard.TargetProperty设置TransformGroup指定的变换"RenderTransform.Children
  4. NS2网络模拟(6)-homework02.tcl
  5. vc有关 directx组态,和dxsdk_extras(directshow)
  6. WPF之VLC流媒体播放
  7. Android 位置服务——BaiduLocation的使用
  8. .NET Framework 源代码
  9. StackLayout
  10. jquery 复选框操作-prop()的使用