目录

  • JDK动态代理
  • 代码实现

JDK动态代理

JDK动态代理使用Proxy类里面的newProxyInstance方法创建代理对象。

Modifier and Type Method and Description
static Object newProxyInstance(ClassLoader loader, 类<?>[] interfaces, InvocationHandler h)返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序。

方法里有三个参数:
第一个参数:类加载器。
第二个参数:增强方法所在类,这个类实现的接口,支持多个接口。
第三个参数:实现这个接口InvocationHandler创建代理的对象,在这个类里写增强的方法。

代码实现

(1)创建接口,定义方法。
(2)创建接口实现类,实现方法。
(3)使用Proxy类创建接口代理对象。

UserDao接口:

package com.Keafmd.spring5;/*** Keafmd** @ClassName: UserDao* @Description:* @author: 牛哄哄的柯南* @date: 2021-01-17 20:41*/public interface UserDao {public int add(int a,int b);public String updat(String id);
}

UserDaoImpl实现类:

package com.Keafmd.spring5;/*** Keafmd** @ClassName: UserDaoImpl* @Description: 实现类* @author: 牛哄哄的柯南* @date: 2021-01-17 20:42*/
public class UserDaoImpl implements UserDao{@Overridepublic int add(int a, int b) {System.out.println("add执行中...");return a+b;}@Overridepublic String updat(String id) {System.out.println("updat执行中...");return id;}
}

JDKProxy类:

package com.Keafmd.spring5;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** Keafmd** @ClassName: JDKProxy* @Description:* @author: 牛哄哄的柯南* @date: 2021-01-17 20:44*/
public class JDKProxy {public static void main(String[] args) {//创建接口实现类代理对象Class[] interfaces = {UserDao.class};/*Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {return null;}});*/UserDaoImpl userDao = new UserDaoImpl();UserDao dao = (UserDao) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDao));System.out.println("-----------对add方法进行增强----------");int result = dao.add(1, 2);System.out.println("result:" + result);System.out.println("------------不增强updat方法------------");String res = dao.updat("Keafmd");System.out.println("res:" + res);}
}//创建代理对象代码
class UserDaoProxy implements InvocationHandler {//把创建的是谁的代理对象,把谁传递过来//有参构造传递private Object obj;public UserDaoProxy(Object obj) {this.obj = obj;}//增强的逻辑@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if ("add".equals(method.getName())) { //通过判断实现对不同方法的增强//方法执行之前System.out.println("方法之前执行..." + method.getName());//被增强的方法执行Object res = method.invoke(obj, args);//方法执行之后System.out.println("方法之后执行" + obj);return res;} else { //不增强Object res = method.invoke(obj, args);return res;}}
}

输出结果:

-----------对add方法进行增强----------
方法之前执行...add
add执行中...
方法之后执行com.Keafmd.spring5.UserDaoImpl@5e481248
result:3
------------不增强updat方法------------
updat执行中...
res:KeafmdProcess finished with exit code 0

以上就是JDK动态代理的代码实现,在Spring5里面已经把动态代理的代码已经做了封装。

看完如果对你有帮助,感谢点赞支持!
如果你是电脑端的话,看到右下角的 “一键三连” 了吗,没错点它[哈哈]

加油!

共同努力!

Keafmd

SpringJDK动态代理实现相关推荐

  1. 【spring】动态代理

    代理 动态代理 特点:字节码随用随创建,随用随加载 作用:不修改源码的基础上对方法增强 分类:基于接口的动态代理.基于子类的动态代理 基于接口的动态代理: 涉及的类:Proxy     提供者:JDK ...

  2. (转)面试必备技能:JDK动态代理给Spring事务埋下的坑!

    一.场景分析 最近做项目遇到了一个很奇怪的问题,大致的业务场景是这样的:我们首先设定两个事务,事务parent和事务child,在Controller里边同时调用这两个方法,示例代码如下: 1.场景A ...

  3. Java动态代理和静态代理区别

    静态代理 package staticproxy;/*** 接口* @author newtouch**/ public interface IHello {public void sayHello( ...

  4. java动态代理【一】

    java动态代理的定义:为其他目标类的方法增加切面的逻辑,即在执行目标类方法的时候,先去执行一段如校验检测的逻辑代码.java通俗一点就是生成一个继承目标类的子类,并在每个调用方法都添加一段逻辑. 应 ...

  5. 支撑Java框架的基础技术:泛型,反射,动态代理,cglib

    以Spring为例要想看明白他的源码需要彻底理解Java的一些基础技术泛型,反射同时对于一些高级技术例如动态代理,cglib和字节码技术也需要掌握,下面就按章节来一一说清楚这些技术的核心部分,最后手写 ...

  6. 支撑Spring的基础技术:泛型,反射,动态代理,cglib等

    1.静态代码块和非静态代码块以及构造函数 出自尚学堂视频:<JVM核心机制 类加载全过程 JVM内存分析 反射机制核心原理 常量池理解> public class Parent {stat ...

  7. 【spring】初识aop(面向切面编程) 使用jdk动态代理

    BankServiceIImple.java 代码实现: package com.zzxtit.aop;import java.math.BigDecimal;public interface Ban ...

  8. java静态代理与动态代理

    2019独角兽企业重金招聘Python工程师标准>>> 代理模式是java常见的设计模式.其目的是为其他对象提供一个代理以控制对某个真实对象的访问.通过代理类这一中间层,有效控制对真 ...

  9. Java动态代理机制

    在Java的动态代理机制中,有两个重要的类.一个是InvocationHandler,另一个是Proxy. InvocationHandler:每一个动态代理类都必须要实现InvocationHand ...

  10. java 反射 动态代理

    在上一篇文章中介绍Java注解的时候,多次提到了Java的反射API.与javax.lang.model不同的是,通过反射API可以获取程序在运行时刻的内部结构.反射API中提供的动态代理也是非常强大 ...

最新文章

  1. nrf51822-添加DFU服务
  2. js word 预览_微软补丁日:Word/DHCP/LNK远程代码执行漏洞预警
  3. leetcode 228. 汇总区间(Java版)
  4. 生成FaceBook所需的散列哈希值
  5. halcon控制算子Control,持续更新
  6. B/S开发中浏览器的工具利器
  7. linux跑循环脚本占内存,Linux下实现脚本监测特定进程占用内存情况
  8. 《Kotlin项目实战开发》第5章 函数与函数式编程
  9. 68 道Redis面试题
  10. 常见类 --Object
  11. vue实现点击复制文本功能
  12. Endnote与知网研学(E-study)题录相互导入
  13. logisim 快速加法器设计实验报告_八位加法器设计实验报告
  14. HTML5背景颜色表格作业,HTML快速入门5——不规则表格、表格背景、边框颜色
  15. 推荐几本大学生必看的书单
  16. 欢迎西南大学人工智能学院加入RICAI !!
  17. html5 csss透明,详解CSS透明opacity和IE各版本透明度滤镜filter的最准确用法
  18. Java基础学习笔记
  19. 404 Not Found [IP: 91.189.91.39 80] 解决办法:换源,还是换源 !!
  20. Cortex-M3/M4芯片启动流程概括

热门文章

  1. 基于51单片机的数字万用表设计
  2. 读书笔记 - Thoughts on interaction design (第二版) - 交互设计沉思录
  3. PDF转EPUB格式电子书经验总结
  4. 永中集成Office的春天能否到来?
  5. 软件测试自学教程——书籍教程篇
  6. Firefox Monitor - 在线免费检测邮箱数据是否泄露
  7. CI框架入门中的简单MVC例子
  8. 微小区2018年度物业缴费数据报告
  9. 2008考研数学辅导讲义理工类高等数学部分-蔡燧林
  10. 示波器的使用和李萨如图形