代理的意思是不直接访问目标对象,而是通过中间对象来访问目标对象。Java分静态代理和动态代理。
静态代理要求目标对象和代理对象实现同一个接口,代理对象中的核心功能由目标对象完成,代理对象只负责增强功能,它的好处是有利于原始对象的功能扩展与维护。由于每个代理类都需要实现接口方法,如果增加一个接口方法,所有目标类代理类都需要实现此接口,这样就增加了代码维护的复杂度。
动态代理可以解决静态代理的复杂问题,动态代理分为两种,1是JDK动态代理,2是cglib动态代理。
JDK动态代理是通过反射机制实现的,在运行时动态地创建一个实现一组给定接口的代理类。代理是在运行时创建的,不是在编译时创建的,因此成为动态代理。jdk动态代理通过Prxoy的静态方法newProxyInstance()来实现的,需要传入被代理对象,和一个实现InvocationHandler接口的实例。
CGLib动态代理是Enhance类继承被代理类来实现的,在运行时会动态地创建一个被代理的子类,并且重写该类所方法(final修饰的方法除外),使得方法的调用都被转发到MethodInterceptor的intercept方法上进行处理。
两者区别:
1.jdk动态代理只能代理实现了接口的类。而Cglib动态代理可以代理任何类。
2.jdk动态代理直接写Class字节码,Cglib动态代理使用ASM框架写class字节码,cglib生成代理类的效率更低。
3.jdk动态代理是通过反射机制调用的,cglib动态代理是使用FastClass机制直接调用对象方法的,cglib动态代理的方法执行效率更高。