Java动态代理是一种在运行时创建代理对象的技术,它可以在不修改原始类的情况下,对类的方法进行控制和扩展。常见应用场景:AOP(面向切面编程)、事务管理、权限控制、日志记录等等。
这种方式要求被代理的类实现一个接口。在运行时,通过Java的反射机制,动态生成一个代理类,该代理类实现了被代理类所实现的接口,并且在代理类的方法中添加了额外的逻辑,这种方式的代理类是通过Proxy类的静态方法newProxyInstance()来创建的。
定义一个接口和实现类:该接口包含了实现类(被代理类)的方法。
创建代理类,该类负责实现 invoke() 方法,在该方法中定义了对原始方法的增强逻辑。
使用Proxy类创建代理对象:使用 Proxy 类的静态方法 newProxyInstance() 来创建代理对象。
该方法接受三个参数:ClassLoader,用于加载代理类;Class[] interfaces,指定被代理类所实现的接口;InvocationHandler,用于处理代理方法的调用。
调用代理对象的方法:通过代理对象调用方法时,实际上会调用 InvocationHandler 的 invoke() 方法。在该方法内部,会根据被调用的方法名称和参数,找到对应的 Method 对象,并通过反射机制调用原始对象的方法。(了解反射机制:Java反射链接)
这种方式要求被代理的类不能是final类。在运行时,通过CGLIB库生成一个被代理类的子类,该子类继承了被代理类的所有方法,并且在子类的方法中添加了额外的逻辑,这种方式的代理类是通过Enhancer类来创建的。
CGLIB库是第三方库需要导入jar包
定义目标类:首先,需要定义一个目标类,即需要被代理的类。
创建拦截器类:创建一个拦截器类,实现MethodInterceptor接口,实现拦截目标方法的逻辑。
创建Enhancer对象:使用CGLIB的Enhancer类创建一个Enhancer对象。
设置被代理类:使用Enhancer对象的setSuperclass方法设置被代理类的Class对象,表示要代理的目标类。
设置回调对象:使用Enhancer对象的setCallback方法设置回调对象,即实现了MethodInterceptor接口的拦截器类。
创建代理对象:使用Enhancer对象的create方法创建代理对象,该方法会根据被代理类和回调对象生成代理类的实例。
使用代理对象:通过代理对象调用目标类的方法。在调用过程中,拦截器类中的逻辑将被触发,实现对目标方法的拦截和增强。
下一篇:实现JDK动态代理
以及------实现CGLIB动态代理