JDK动态代理与CGLIB动态代理
2018-03-01 19:09
246 查看
JDK动态代理
JDK的代理最大的缺点是需要提供接口,在MyBatis的Mapper就是一个接口,它采用的就是JDK的动态代理。
java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。
JDK动态代理中包含一个类和一个接口:
InvocationHandler接口:
参数说明:
Object proxy:指被代理的对象。
Method method:要调用的方法
Object[] args:方法调用时所需要的参数
InvocationHandler接口的子类想象成一个代理的最终操作类
Proxy类:
Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类,此类提供了如下的操作方法:
参数说明:
ClassLoader loader:类加载器
Class<>[] interfaces:得到全部的接口
InvocationHandler h:得到InvocationHandler接口的子类实例
动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。
Cglib动态代理
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
他需要实现MethodInterceptor接口
这样便能够实现CGLIB的动态代理,在MyBatis中通常在延迟加载的时候才会用到CGLIB的动态代理。
一般说Spring的核心是IOC和AOP,IOC的实现原理是工厂模式加反射技术,而AOP的实现原理就是动态代理,MyBatis中的Mapper接口也是通过JDK动态代理实现。
JDK的代理最大的缺点是需要提供接口,在MyBatis的Mapper就是一个接口,它采用的就是JDK的动态代理。
java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。
JDK动态代理中包含一个类和一个接口:
InvocationHandler接口:
public interface InvocationHandler { public Object invoke(Object proxy,Method method,Object[] args) throws Throwable; }
参数说明:
Object proxy:指被代理的对象。
Method method:要调用的方法
Object[] args:方法调用时所需要的参数
InvocationHandler接口的子类想象成一个代理的最终操作类
Proxy类:
Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类,此类提供了如下的操作方法:
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException
参数说明:
ClassLoader loader:类加载器
Class<>[] interfaces:得到全部的接口
InvocationHandler h:得到InvocationHandler接口的子类实例
动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。
Cglib动态代理
JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
他需要实现MethodInterceptor接口
public class HelloServiceCglib implements MethodInterceptor { private Object target; /** * 创建代理对象 * * @param target * @return */ public Object getInstance(Object target) { this.target = target; Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(this.target.getClass()); // 回调方法 enhancer.setCallback(this); // 创建代理对象 return enhancer.create(); } @Override // 回调方法 public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("我准备说hello了"); proxy.invokeSuper(obj, args); System.out.println("我说过hello了"); return null; } }
这样便能够实现CGLIB的动态代理,在MyBatis中通常在延迟加载的时候才会用到CGLIB的动态代理。
一般说Spring的核心是IOC和AOP,IOC的实现原理是工厂模式加反射技术,而AOP的实现原理就是动态代理,MyBatis中的Mapper接口也是通过JDK动态代理实现。
相关文章推荐
- 输出cglib以及jdk动态代理产生的class文件
- java动态代理(JDK和cglib)
- Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC
- jdk动态代理 和 CGLIB动态代理 详解
- 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务
- cglib与JDK动态代理适用场景
- jdk动态代理和cglib代理demo及总结
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- 【转载】Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
- JDK动态代理和CGLIB动态代理
- 实现动态代理的两种方式介绍+例子demo(JDK、CGlib)
- 获取JDK动态代理/CGLIB代理对象代理的目标对象。
- Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)
- Spring AOP详解 、 JDK动态代理、CGLib动态代理
- 设计模式之代理模式(静态代理、JDK动态代理和cglib动态代理)
- JDK动态代理与CGLIB动态代理应用及源码解析
- java动态代理(JDK和cglib)
- java动态代理(JDK和cglib)
- 7种结构型模式之:代理模式 、JDK动态代理、cglib动态代理