JDK动态代理
实现原理
JDK动态代理是通过反射去实现目标类的所有接口
实现步骤
1.Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{IPerson.class}, this); <br>第一个参数是类加载器<br>第二个参数是目标类实现的所有接口<br>第三个参数是实现了InvocationHandler接口的类,该类的invoke方法就是客户端调用代理类所去执行的方法
2.拿到代理类
3.执行目标方法
CGlib
实现原理
CGlib的实现原理是通过代理类继承目标类的方式(private static final修饰的不能被继承),代理类重写里面所有的方法<br>
实现步骤
1.创建一个目标类以及方法
2.创建一个接口实现MethodInterceptor,重写里面的intercept方法
3.创建一个生成代理类的方法getInstance(Object target);
4.获取代理类,调用代理类的方法
动态代理的优缺点
1、优点在于能将目标对象与代理对象分离,降低系统的耦合度,易于方法的拓展,同时也能保护目标对象<br>
2、缺点是增加了系统的复杂度,在客户端与目标对象之间多了一个代理类,调用方法变慢<br>
JDK动态代理和CGlib的区别(面试高频)
1.JDK动态代理是通过反射来实现目标类的接口生成的代理类,而CGlib是通过继承目标类重写里面的方法
2.CGlib在运行时生成字节码文件的效率要比JDK动态代理低,它用的是ASM框架,比较复杂
3.CGlib在调用方法的时候使用的是FastClass机制,类似于索引,调用的效率比JDK的要高