【概述】

JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。

  InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态地将横切逻辑和业务逻辑编织在一起。

  Proxy利用InvocationHandler动态地创建一个符合某一接口的实例,生成目标类的代理对象。

【案例分析】

查看Salary:

  1.启动日志

  2.启动安全性的框架

  3.检查权限:如果有查看工资的权限,则查看工资,否则提示"权限不足"

【工厂截图】

【SalaryManager.java】

package com.HigginCui.proxy.salary;//目标接口
public interface SalaryManager {//查看工资public void showSalary();
}

【SalaryManagerImpl.java】

package com.HigginCui.proxy.salary;
//目标类
public class SalaryManagerImpl implements SalaryManager{@Overridepublic void showSalary() {System.out.println("Show Salary...");}
}

【Logger.java】

package com.HigginCui.proxy.salary;
//日志类
public class Logger {public void logging(){System.out.println("logging ...");}
}

【Privilege.java】

package com.HigginCui.proxy.salary;
//权限类
public class Privilege {private String access;public String getAccess() {return access;}public void setAccess(String access) {this.access = access;}
}

【Security.java】

package com.HigginCui.proxy.salary;
//安全性框架类
public class Security {public void security(){System.out.println("security ...");}
}

【SalaryManagerInterceptor.java】

package com.HigginCui.proxy.salary;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
//拦截器
public class SalaryManagerInterceptor implements InvocationHandler{private Object target;private Logger logger;private Security security;private Privilege privilege;  /**   * target:希望被代理的目标对象   */public SalaryManagerInterceptor(Object target,Logger logger,Security security,Privilege privilege){this.target=target;this.logger=logger;this.security=security;this.privilege=privilege;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {//1.开启日志this.logger.logging();//2.开启安全性框架类this.security.security();//3.检查权限,如果是"admin",则允许查看,否则提示"权限不足"if(this.privilege.getAccess().equals("admin")){//4.调用目标方法
            method.invoke(target, args);    //通过java反射间接调用目标对象的方法}else{System.out.println("权限不足...");}return null;}}

【SalaryTest.java】

package com.HigginCui.test;import java.lang.reflect.Proxy;import org.junit.Test;import com.HigginCui.proxy.salary.Logger;
import com.HigginCui.proxy.salary.Privilege;
import com.HigginCui.proxy.salary.SalaryManager;
import com.HigginCui.proxy.salary.SalaryManagerImpl;
import com.HigginCui.proxy.salary.SalaryManagerInterceptor;
import com.HigginCui.proxy.salary.Security;
//模拟客户端
public class SalaryTest {@Testpublic void testSalart(){Object target=new SalaryManagerImpl();  //希望被代理的目标对象Logger logger =new  Logger();Security security=new Security();Privilege privilege=new Privilege();/** 如果是"admin",提示"Show Salary..."* 否则,提示"权限不足"*/privilege.setAccess("admin");     //将目标业务对象target和横切代码编织到一起SalaryManagerInterceptor interceptor=new SalaryManagerInterceptor(target, logger, security, privilege); /**     *  第1个参数:目标对象target的类加载器     *  第2个参数:目标对象target的需要实现的接口      *  第3个参数:整合了目标对象的和横切代码的编织器对象interceptor      */     SalaryManager proxy=(SalaryManager) Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),interceptor);proxy.showSalary();}
}

【运行结果】

logging ...
security ...
Show Salary...

【分析】

(1)关于InvocationHandler接口

[ invoke(Object proxy,Method method,Object[] args)方法 ]

proxy:  最终生成的代理对象,一般不会用到

method: 被代理目标实例的某个具体方法,通过它可以发起目标实例方法的反射调用

args: 通过被代理的实例的方法的参数,在方法反射调用时使用。

[ 构造方法 ]

构造方法中通过target传入希望被代理的目标对象。

在例子中的接口方法invoke(Object proxy,Method method,Object[] args)方法中,将目标实例传递给method.invoke(target,args)方法,调用目标方法。

转载于:https://www.cnblogs.com/HigginCui/p/5582617.html

17_AOP入门准备_Salay案例(利用动态代理)相关推荐

  1. Android 动态代理以及利用动态代理实现 ServiceHook

    这篇博客主要介绍使用 InvocationHandler 这个接口来达到 hook 系统 service ,从而实现一些很有意思特殊功能的详细步骤. 转载请注明出处:http://blog.csdn. ...

  2. 如何利用动态代理IP来做SEO(网络营销)

    对动态代理IP大家都不陌生,今天我们来聊下如何利用动态代理ip来做SEO优化.其实除了SEO很多网络营销也都需要用到代理IP,因为很多网络营销的用户都知道,投票.注册帐号.发帖子等工作,都需要用到代理 ...

  3. 动态代理的分析以及利用动态代理模式进行敏感词汇过滤

    动态代理 增强对象的功能: 设计模式:一些通用的解决固定问题的方式 代理模式 概念: (1). 真实对象:被代理的对象 (2). 代理对象: (3). 代理模式:代理对象代理真实对象,达到增强真实对象 ...

  4. 利用动态代理来实现DAO层中的方法

    动态代理实现接口 动态代理机制是jdk1.3版本以后引入的,在下面我主要用动态代理来实现接口,并且用注释来代替查询语句注释 DAO方法如下 package com.yf.dao;import java ...

  5. 动态代理案例1:运用Proxy动态代理来增强方法

    动态代理案例1: /*要求:运用Proxy动态代理来增强方法 题目:     1.定义接口Fruit,其中有addFruit方法     2.定义实现类FruitImpl,实现Fruit接口     ...

  6. Android APP热更新中的插件化(Hook技术:反射或动态代理),Demo (2)

    修改AAPT,资源分区,用于Android插件化- https://github.com/BaoBaoJianqiang/AAPT -- Android下的挂钩(hook)和代码注入(inject) ...

  7. 软件设计模式 | 动态代理模式

    文章目录 一.动态代理概述 1.1 代理的概述和作用 1.2 动态代理的优点 1.3 代理对象的创建 1.4 代理对象调用方法的执行流程 二.动态代理举例 2.1 歌手经纪人 2.2 业务功能的性能统 ...

  8. Java 动态代理机制分析及扩展,第 1 部分

    引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...

  9. Java 动态代理机制分析及扩展

    简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟推演了动态代理类的可能实现,向读者阐述了一个完整的 Java 动态代理运作过程,希望能帮助读者加深对 Java 动 ...

  10. Java 动态代理及 RPC 框架介绍

    所谓动态代理,指的是语言提供的一种语法,能够将对对象中不同方法的调用重定向到一个统一的处理函数中来. python重写__getattr__函数能够做到这一点,就连世界上最好的语言也提供称为魔术方法的 ...

最新文章

  1. python免安装环境 linux_python如何打包脚本(库也一起打包),直接在linux环境运行,不需要安装库?...
  2. Android系统初始化过程分析(Android 4.3)
  3. 中国人民银行:关于防范代币发行融资风险的公告
  4. C++基础03-C++对c的拓展-函数
  5. JMeter源码集成到Eclipse
  6. 一则 Oracle 和 SqlServer 语法区别 (原创)
  7. centos7 jenkins 安装
  8. mybatis mapper配置 bigint_Mybatis-plus 入门
  9. 对象转json时,Date类型字段处理。
  10. matlab对5个矩阵循环求均值,MATLAB循环求数组的平均值 每隔几个数据求一下平均值...
  11. win10系统个人服务器配置,个人电脑win10配置服务器吗
  12. 基于 AUTOSAR 的电动汽车中央控制单元 CAN 通信软件开发
  13. 黄金分割数0.618与美学有重要的关系。舞台上报幕员所站的位置大约就是舞台宽度的0.618处
  14. mysql计算月初日期_mysql 获取上月、本月月初月末
  15. java程序员越来越多,为啥工资反而越来越高?
  16. PHPExcel导入excel的内容以及表格里的图片
  17. CSS line-height 三种赋值方式有何区别 (琐碎知识点整理)
  18. TI公司与MSP430单片机
  19. 《技术立国》——日立的小平浪平传
  20. 要不要借钱给朋友和投资股票的共性

热门文章

  1. 每秒订单数25倍提升,蘑菇街怎样跨过海量服务架构的技术藩篱?
  2. Win10-64位上编译CodeLite13.0.0源码
  3. mysql创建表格例子_Mysql创建表例子 | restcy 技术博客
  4. 我的完整版mbti职业性格测试
  5. [USACO10HOL]赶小猪
  6. Altium Designer 18中的Data Management–Device Sheets
  7. React 状态管理: Recoil - Facebook 状态管理
  8. golang 获取文件大小
  9. 无线路由器设置里的DHCP服务是什么意思
  10. python实现xlsx批量转xls(或者xls批量转xlsx)