本文用jdk动态代理模拟了spring的AOP的实现技术

AOP面向切面编程,可用于权限验证,效率检查,事务,异常管理等

JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中 InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,在并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一 起。
而Proxy为InvocationHandler实现类动态创建一个符合某一接口的代理实例

UserDAOImpl.java

public class UserDAOImpl implements UserDAO {

public void save(User user) {
 
                System.out.println("user saved!");
        }

public void delete() {
                System.out.println("user deteleted");
                
        }

}

LogInterceptor.java//处理程序必须实现InvocationHandler接口

public class LogInterceptor implements InvocationHandler {
        private Object target;   //被代理的对象
        
        public Object getTarget() {
                return target;
        }

public void setTarget(Object target) {
                this.target = target;
        }

public void beforeMethod(Method m) {
                
                System.out.println(m.getName() + " start");
        }

/*      proxy是代理实例,一般不会用到;method是代理实例上的方法,通过它可以发起对目标类的反射调用;
 * args是通过代理类传入 的方法参数,在反射调用时使用
 * */

public Object invoke(Object proxy, Method method, Object[] args)
                        throws Throwable {
                beforeMethod(m);
                m.invoke(target, args);
                return null;
        }
}

UserServiceTest.java

public void testProxy() {
                UserDAO userDAO = new UserDAOImpl();
                LogInterceptor li = new LogInterceptor();  //创建一个Handerler对象
                li.setTarget(userDAO);   //将Handler对象和被代理对象关联
                /*newProxyInstance参数含义
                 * 第一个参数:代理的类加载器,必须和被代理的对象是一个类加载器
                 * 第二个参数含义:代理对象要实现的那些接口
                 * 第三个参数:指派方法调用的调用处理程序
                 * */
                UserDAO userDAOProxy = (UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), userDAO.getClass().getInterfaces(), li);
                System.out.println(userDAO.getClass().getInterfaces().getClass());
                System.out.println(userDAOProxy.getClass().getInterfaces()[0]);
                userDAOProxy.delete();
                userDAOProxy.save(new User());
                
        }

运行结果:

interface com.bjsxt.dao.UserDAO
delete start
user deteleted
save start
user saved!

转载于:https://www.cnblogs.com/toSeeMyDream/p/5537720.html

JDK_Proxy_InvocationHandler_动态代理相关推荐

  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. 澳大利亚悉尼科技大学招收人工智能/软件工程方向全奖博士生
  2. ASM3.0学习(二)
  3. Oracle 创建及调用存储过程,脚本示例
  4. c语言已知斜率 求倾角,倾斜解的问题
  5. 数据结构:用栈实现表达式的转换(文字描述+详细步骤示例)——中缀转后缀
  6. 员工离职时被HR回复“猝死了再说”!HR道歉:没控制好情绪
  7. ERROR:ModuleNotFoundError: No module named ‘cv2‘
  8. 第七章实验报告(数组实验)
  9. 数据库连接软件SQLyog 13.1.7 免费下载安装
  10. Oracle 获取汉字拼音首字母
  11. gauscoor软件怎么用_比对软件STAR的简单使用
  12. Windchill 零件操作通用类
  13. HTML5期末大作业:餐饮文化网站设计——餐饮文化(8页) HTML+CSS+JavaScript 学生DW网页设计美食文化
  14. “0X????????”指令引用的“0x00000000”内存,该内存不能为“read”或“written”
  15. JavaWeb 狂神
  16. ONF(Open Networking Foundation)
  17. 基于树的机器学习模型的演化
  18. linux下生成dump文件方法及设置
  19. 第三部分 数据结构 -- 第四章 图论算法-1383:刻录光盘(cdrom)
  20. Java 破解谷歌翻译api,可以实现程序自动化翻译文章

热门文章

  1. ExtJS 4中动态加载的路径设置
  2. ASP.NET版本不是1.1, 2.0的也一样
  3. 华为诺亚方舟 | 构建1亿组图文对中文多模态数据集
  4. 真实场景下如何解决类别不平衡问题
  5. 为什么我们更宠爱“随机”梯度下降?(SGD)
  6. 写题10分钟,写题解8小时,一道头条面试题,真心难。
  7. 机器学习入门——详解主成分分析
  8. 排序算法之——堆排序分析
  9. 读书月巨献丨博文视点大咖直播伴你读
  10. 荐书丨被Dubbo虐过吗,反击开始!——《深入理解Apache Dubbo与实战》