17_AOP入门准备_Salay案例(利用动态代理)
【概述】
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案例(利用动态代理)相关推荐
- Android 动态代理以及利用动态代理实现 ServiceHook
这篇博客主要介绍使用 InvocationHandler 这个接口来达到 hook 系统 service ,从而实现一些很有意思特殊功能的详细步骤. 转载请注明出处:http://blog.csdn. ...
- 如何利用动态代理IP来做SEO(网络营销)
对动态代理IP大家都不陌生,今天我们来聊下如何利用动态代理ip来做SEO优化.其实除了SEO很多网络营销也都需要用到代理IP,因为很多网络营销的用户都知道,投票.注册帐号.发帖子等工作,都需要用到代理 ...
- 动态代理的分析以及利用动态代理模式进行敏感词汇过滤
动态代理 增强对象的功能: 设计模式:一些通用的解决固定问题的方式 代理模式 概念: (1). 真实对象:被代理的对象 (2). 代理对象: (3). 代理模式:代理对象代理真实对象,达到增强真实对象 ...
- 利用动态代理来实现DAO层中的方法
动态代理实现接口 动态代理机制是jdk1.3版本以后引入的,在下面我主要用动态代理来实现接口,并且用注释来代替查询语句注释 DAO方法如下 package com.yf.dao;import java ...
- 动态代理案例1:运用Proxy动态代理来增强方法
动态代理案例1: /*要求:运用Proxy动态代理来增强方法 题目: 1.定义接口Fruit,其中有addFruit方法 2.定义实现类FruitImpl,实现Fruit接口 ...
- Android APP热更新中的插件化(Hook技术:反射或动态代理),Demo (2)
修改AAPT,资源分区,用于Android插件化- https://github.com/BaoBaoJianqiang/AAPT -- Android下的挂钩(hook)和代码注入(inject) ...
- 软件设计模式 | 动态代理模式
文章目录 一.动态代理概述 1.1 代理的概述和作用 1.2 动态代理的优点 1.3 代理对象的创建 1.4 代理对象调用方法的执行流程 二.动态代理举例 2.1 歌手经纪人 2.2 业务功能的性能统 ...
- Java 动态代理机制分析及扩展,第 1 部分
引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...
- Java 动态代理机制分析及扩展
简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟推演了动态代理类的可能实现,向读者阐述了一个完整的 Java 动态代理运作过程,希望能帮助读者加深对 Java 动 ...
- Java 动态代理及 RPC 框架介绍
所谓动态代理,指的是语言提供的一种语法,能够将对对象中不同方法的调用重定向到一个统一的处理函数中来. python重写__getattr__函数能够做到这一点,就连世界上最好的语言也提供称为魔术方法的 ...
最新文章
- python免安装环境 linux_python如何打包脚本(库也一起打包),直接在linux环境运行,不需要安装库?...
- Android系统初始化过程分析(Android 4.3)
- 中国人民银行:关于防范代币发行融资风险的公告
- C++基础03-C++对c的拓展-函数
- JMeter源码集成到Eclipse
- 一则 Oracle 和 SqlServer 语法区别 (原创)
- centos7 jenkins 安装
- mybatis mapper配置 bigint_Mybatis-plus 入门
- 对象转json时,Date类型字段处理。
- matlab对5个矩阵循环求均值,MATLAB循环求数组的平均值 每隔几个数据求一下平均值...
- win10系统个人服务器配置,个人电脑win10配置服务器吗
- 基于 AUTOSAR 的电动汽车中央控制单元 CAN 通信软件开发
- 黄金分割数0.618与美学有重要的关系。舞台上报幕员所站的位置大约就是舞台宽度的0.618处
- mysql计算月初日期_mysql 获取上月、本月月初月末
- java程序员越来越多,为啥工资反而越来越高?
- PHPExcel导入excel的内容以及表格里的图片
- CSS line-height 三种赋值方式有何区别 (琐碎知识点整理)
- TI公司与MSP430单片机
- 《技术立国》——日立的小平浪平传
- 要不要借钱给朋友和投资股票的共性
热门文章
- 每秒订单数25倍提升,蘑菇街怎样跨过海量服务架构的技术藩篱?
- Win10-64位上编译CodeLite13.0.0源码
- mysql创建表格例子_Mysql创建表例子 | restcy 技术博客
- 我的完整版mbti职业性格测试
- [USACO10HOL]赶小猪
- Altium Designer 18中的Data Management–Device Sheets
- React 状态管理: Recoil - Facebook 状态管理
- golang 获取文件大小
- 无线路由器设置里的DHCP服务是什么意思
- python实现xlsx批量转xls(或者xls批量转xlsx)