首先定义一个接口

public interface IStars {void sing();void dance();
}

其中有两个对应star的方法,dance和sing;

然后定义一个star类来实现这个接口

public class Stars implements IStars {private String name;public Stars(String name){this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic void sing() {System.out.println(getName() + "唱了一首歌");}@Overridepublic void dance() {System.out.println(getName() + "跳了一支舞");}
}

这时,需要一个代理类来实现对star类的动态代理,即定义一个代理类

public class StarsNewProxy implements InvocationHandler {private Object object;public StarsNewProxy(Object o){this.object = o;}private boolean runBefore(Method method){System.out.println("拦截到代理请求");if(method.getName().equals("dance")){System.out.println("明星脚受伤了,不能跳舞表演了");return false;}return true;}private void runAfter(Method method){System.out.println(method.getName() + "代理请求完毕");}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if(!runBefore(method))return null;Object result = method.invoke(object, args);runAfter(method);return result;}
}

实现InvocationHandler接口,重写invoke方法,其中的method.invoke即是执行这个方法,除此之外还可以在执行这个方法前和方法后定义一些其他的操作,有点类似于AOP的思想。

接下来我们实现一个测试类

public class Test {public static void main(String[] args) {IStars iStars = new Stars("Frank");InvocationHandler handler = new StarsNewProxy(iStars);IStars proxy = (IStars) Proxy.newProxyInstance(iStars.getClass().getClassLoader(), iStars.getClass().getInterfaces(), handler);proxy.dance();proxy.sing();}
}

执行结果如下:

本文中的动态代理是通过JDK动态代理机制实现的,必须要先实现业务接口,即IStar接口;然后根据反射机制找到对应的被代理的类,就可以在动态生成的代理类中调用业务实现类的同名方法。

Java实现动态代理示例相关推荐

  1. 设计模式总结——代理模式以及java的动态代理

    定义 给目标对象一个代理对象,并由代理对象控制对目标对象的引用.联想到生活中就像是海外代购 既然是代理,就说明他要做的事情要比你直接去做要做的多,这就联系到了方法的增强,也就联系到了AOP,面向切面. ...

  2. java的动态代理机制详解

    2019独角兽企业重金招聘Python工程师标准>>> 参考资料 1.java的动态代理机制详解 转载于:https://my.oschina.net/Howard2016/blog ...

  3. 代理模式及Java实现动态代理

    代理模式 定义:给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原对象,而是通过代理对象间接地操控原对象. 代理模式UML图 在上图中: RealSubject 是原对象 ...

  4. 看完Java的动态代理技术——Pythoner笑了

    Java的动态代理常用来包装原始方法调用,用于增强或改写现有方法的逻辑,它在Java技术领域被广为使用,在阿里的Sofa RPC框架序列化中你能看到它的身影,Hibernate的实体类功能增强也是以动 ...

  5. 深入理解Java反射+动态代理,java开发面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起在群里探讨技术. 答: ...

  6. Java特性-动态代理

    代理在开发中无处不在: 我们完成一个接口开发A,接口下有很多个实现类,这些类有些共同要处理的部分,比如每一个类都定义了接口A中的方法getXX(String name).我现在想把每次调用某个实现类的 ...

  7. java CGLIB动态代理

    CGLIB动态代理 一:CGLIB(Code Generation Library)是一个基于ASM的字节码生成库,它允许我们在运行时对字节码进行修改和动态生成.CGLIB通过继承方式实现代理. 二: ...

  8. Java - JDK动态代理原理

    Java - JDK动态代理原理 前言 一. JDK动态代理源码分析 1.1 生成目标代理类 getProxyClass0 1.1.1 KeyFactory 生成接口的虚引用 1.1.2 ProxyC ...

  9. [Java|面试] 面试被问Java的动态代理机制,能说说吗

    Java的动态代理机制 文章目录 Java的动态代理机制 0. 什么是代理 1.动态代理和静态代理的区别 2. 使用代理的情况 3. 动态代理的构成 4. JDK中的动态代理 5. 手写一个JDK动态 ...

最新文章

  1. cmder里ls、pwd、自定义的alias等一系列命令都无法使用
  2. R语言使用GGally包的ggpairs函数可视化变量相关性分析图:包含散点图、密度图、柱状图、箱图等、并自定义数据点的大小
  3. python画图哆啦a梦-python 绘制哆啦A梦
  4. 负样本的艺术,再读Facebook双塔向量召回算法
  5. 2012黑龙江省赛J题-最小均值圈
  6. c语言数据结构将链串里所有值为x的字符删除_redis数据结构与对象到底长什么样?...
  7. Myeclipse5.5获取注册码
  8. mysql服务连接标识_MySQL 连接 | 菜鸟教程
  9. 《Linux内核设计与实现》读书笔记(12)--- 内存管理(2)
  10. javascript 图解 event对象offsetX, clientX, pageX, screenX, layerX, x区别
  11. Modbus是什么?与RS485协议区别与联系有哪些
  12. Python机器学习入门;推荐一本Python数据分析与机器学习入门书籍-唐宇迪《跟着迪哥学 Python数据分析与机器学习实战》PDF+源代码
  13. 显卡虚拟化--最强实践
  14. STM32的延迟函数1us、1ms
  15. mysql数值比中文检索快_【mysql】利用全文索引实现中文的快速查找
  16. ipad云计算机,过气iPad2还能这么玩!用云电脑玩PC云游戏
  17. suse账号解锁_Linux多次登录失败用户被锁定使用Pam_Tally2解锁
  18. 怎么下载网页上的视频(you-get)
  19. opencv中puttext()函数的使用
  20. 企业的应用架构演变之路

热门文章

  1. 【力扣638】 大礼包问题 JAVA全过程详解,绝对易懂
  2. 【面试题】973- 一篇由简到难的 Vue 面试题+详解答案
  3. 通过feign调用接口
  4. Python进制转换后去掉“0b“,“0x“,“0o“
  5. 根据不同时间显示不同的图片(JS)
  6. 一行代码,生成和读取二维码!
  7. 神马搜索php,神马搜索api
  8. python中zip函数详解_Python中zip函数用法
  9. Docker的历史背景
  10. Java学习预科阶段