什么是动态代理?

当我们需要给某个类或者接口中的方法添加一些额外的功能比如日志、事务的时候,可以通过创建一个代理类来实现这些功能;该代理类既包含了原有类的完整功能,同时在这些功能的基础上添加了其他的逻辑。这个代理类不是事先定义好的,而是动态生成的,比较灵活;

有几种动态代理

1.java动态代理

java动态代理有个缺点就是要被代理的类必须实现一个接口,否则没法代理

2.cglib动态代理

cglib动态代理可以对没有实现接口的类进行代理

动态代理的应用

AOP

在我们用到spring框架的时候碰到的aop前置后置通知都是基于动态代理来实现的,这里不细追。

如何编写动态代理案例?

我们使用java的动态代理来编写一个案例,主要分为以下几步:

1.编写一个常规方法的接口,这里我们定义一个用户接口,并且编写保存用户方法save()

/*** 用户接口*/
public interface UserDao {public void save();//定义保存用户的方法
}

2.编写用户接口的实现类,并且实现接口方法save()

/**
*  用户接口实现类
*/
public class UserDaoImp implements UserDao {@Overridepublic void save() {System.out.println("保存用户");System.out.println("保存成功啦");}
}

3.编写自己的MyInvocationHandler实现InvocationHandler接口,重写invoke方法来添加我们需要添加的额外功能

public class MyInvocationHandler implements InvocationHandler {//被动态代理的对象private Object target;public MyInvocationHandler(Object target) {this.target = target;}/*** 这个代理类到底是多了什么额外功能*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("开始记录日志,方法开始执行...");method.invoke(target,args);System.out.println("结束记录日志,方法结束执行...");return null;}
}

4.通过Proxy来生成代理对象,有俩种方式

public static void main(String[] args) throws Exception {/*** 方式一*///通过调用动态代理类Proxy的newProxyInstance()生成代理对象UserDao userDao= (UserDao) Proxy.newProxyInstance(UserDao.class.getClassLoader(),new Class<?>[] { UserDao.class }, // 被代理类的接口new MyInvocationHandler(new UserDaoImp()));//要被代理的对象userDao.save();/*** 方式二*///编写invocationhandler实现额外功能InvocationHandler handler = new MyInvocationHandler(new UserDaoImp());//通过调用动态代理类Proxy的getProxyClass()方法获取要代理的类Class<?> proxyClass = Proxy.getProxyClass(UserDao.class.getClassLoader(), UserDao.class);//通过代理类生成代理对象UserDao userDao1 = (UserDao) proxyClass.getConstructor(InvocationHandler.class).newInstance(handler);userDao1.save();}

运行结果如下所示:

什么是动态代理?动态代理有哪些应用?如何编写动态代理案例相关推荐

  1. c语言动态烟花小程序代码,如何用c语言编写动态烟花

    用c语言编写动态烟花的方法:首先绘制菜单界面显示文字:然后设置烟花有上升阶段和爆炸阶段,定义烟花和烟花弹结构体:最后初始化数据,加载资源贴图,随机发射数目随机. 用c语言编写动态烟花的方法: 效果展示 ...

  2. java编写代理服务器_如何编写Java代理

    java编写代理服务器 对于vmlens (轻量级Java竞争条件捕获器),我们使用Java代理来跟踪字段访问. 这是我们学习的实现此类代理的经验教训. 开始 使用"静态公共静态无效值pre ...

  3. 如何编写Java代理

    对于vmlens (轻量级Java竞争条件捕获器),我们使用Java代理来跟踪字段访问. 这是我们学习的实现此类代理的经验教训. 开始 使用" static public static vo ...

  4. Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理

    Java动态代理的两种实现方法:JDK动态代理和CGLIB动态代理 代理模式 JDK动态代理 CGLIB动态代理 代理模式 代理模式是23种设计模式的一种,指一个对象A通过持有另一个对象B,可以具有B ...

  5. Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理:

    ① JDK动态代理只提供接口的代理,不支持类的代理,要求被代理类实现接口.JDK动态代理的核心是InvocationHandler接口和Proxy类,在获取代理对象时,使用Proxy类来动态创建目标类 ...

  6. 动态代理源码分析,实现自己的动态代理

    什么是代理 增强一个对象的功能 买火车票,app就是一个代理,他代理了火车站,小区当中的代售窗口 java当中如何实现代理 java实现的代理的两种办法 代理的名词 代理对象 增强后的对象 目标对象 ...

  7. 动态代理最全详解系列[2]-Proxy生成代理类对象源码分析

      之前我们通过JDK中的Proxy实现了动态代理,Proxy用起来是比较简便的,但理解起来不是那么清晰,是因为我们并没有看见代理类是怎么生成的,代理类怎么调用的被代理类方法,所以下面我们进入源码看一 ...

  8. 深入理解JDK动态代理原理,使用javassist动手写一个动态代理框架

    文章目录 系列文章索引 一.动手实现一个动态代理框架 1.初识javassist 2.使用javassist实现一个动态代理框架 二.JDK动态代理 1.编码实现 2.基本原理 (1)getProxy ...

  9. 【飞秋】使用C# 4编写动态的代码

    (1)使用C# 4编写动态的代码 C# 4新增了一个dynamic关键字,可以用它来编写"动态"的代码. 例如,以下代码创建了一个ExpandoObject对象(注意必须定义为dy ...

最新文章

  1. AJAX 一些常用方法
  2. 从PC、数据中心再到边缘计算,Zen架构的终点在哪?
  3. AppCode下的cs类 取得相关路径
  4. Java Class Loader Retrospect
  5. android 开发时遇到的环境问题3--eclipse整个项目工程报错
  6. 一觉醒来,借呗竟然被封了
  7. 一些有用的SQL Server函数
  8. Magento 自定义URL 地址重写
  9. centos7源码安装mysql8.0_CentOS7下源码安装MySQL 8.x
  10. 编程范式之rotate操作
  11. SQL Server不存在或拒绝访问故障的排除
  12. android pie华为更新,华为多款机型近期将迎来Android Pie系统更新,下列这几款肯定有你...
  13. 3D中obj文件操作
  14. RectTransformUtility.ScreenPointToWorldPointInRectangle使用说明
  15. FPGA实现sobel边缘检测并Modelsim仿真,与MATLAB实现效果对比
  16. 家用计算机常见故障及解决方式,常见电脑故障及处理办法 计算机常见故障原因及解决方法...
  17. spark整合hive
  18. html 正方形字符,HTML常用标签以及特殊符号
  19. iOS开发中SDK是什么?
  20. BUUCTF misc 九连环

热门文章

  1. R语言对京东商品进行文本爬虫
  2. eclipse出现Package jdk.internal.jimage.decompressor in both module java.base and module jrt.fs错误解决办法
  3. java利用穷举的思想实现 泊松分酒算法
  4. 【DSU+思维】CF855G Harry Vs Voldemort
  5. Android 百度地图--定位、周边搜索
  6. 怎么使用黑鲨U盘启动制作U盘系统?
  7. 【AI视野·今日NLP 自然语言处理论文速览 第三期】Tue, 8 Jun 2021
  8. android光照传感器,Android 传感器--光照传感器详解及使用
  9. ps无法完成请求因为程序错误
  10. 姜小白的Python日记Day6 集合的用法