12.动态代理

无人久伴 提交于 2020-03-09 15:26:25

参考的学习视频→https://b23.tv/av47952931/p82

-特点:字节码随用随创建,随用随加载
-作用:不修改源码的基础上对方法增强
-分类
  1. 基于接口的动态代理
  2. 基于子类的动态代理

▲基于接口的动态代理

-涉及的类:Proxy   
-提供者:JDK官方  
-如何创建代理对象:使用Proxy类中的newProxyInstance方法
-创建代理对象的要求:被代理类最少实现一个接口,否则不能使用
-newProxyInstance方法的参数
  • Classloader:类加载器
    • 用于加载代理对象字节码,和被代理对象使用相同的类加载器(固定写法)
  • Class[]:字节码数组
    • 用于让代理对象和被代理对象有相同的方法(固定写法)
  • InvocationHander:用于提供增强的代码
    • 写如何代理,一般我们会写一个该接口的实现类,通常情况下为匿名内部类,但不是必须的

▲示例

新建MAVEN工程,配置POM文件,规定打包形式为JAR
 
新建一个接口类
 
 
定义接口类IProducer
 
 
IProducer接口定义了销售saleProduct和售后afterService两个方法
 
 
定义接口实现类Producer
 
 
Producer继承IProducer接口并实现其方法
 
 
模拟一个消费者Client
 
 
main函数中运用代理
 
 
运行结果
 

 

▲基于子类的动态代理

-涉及的类:Enhancer   
-提供者:第三方cglib库  
-如何创建代理对象:使用Enhancer类中的create方法
-创建代理对象的要求:被代理类不能是最终类
-create方法的参数
  • Class:字节码
    • 用于指定被代理对象的字节码
  • Callback:用于提供增强的代码
    • 写如何代理,一般我们会写一个该接口的子接口实现类MethodInterceptor

▲示例

新建maven工程,pom文件加入cglib依赖
 
 
Producer与上例相同,不同之处在于它不再继承任何接口
 
 
而main函数中用Enhancer.create获取代理商
 
 
运行结果
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!