传统动态代理实现计算器类日志功能
1 接口
public interface Caculator {public int add(int op1, int op2);public int sub(int op1, int op2);public int mul(int op1, int op2);public int div(int op1, int op2);
}
2 日志工具类
/*
1 这个日志工具类用了反射的思维,有四个不同的方法对应着核心方法的四个重要的位置,
分别是运行前,运行后,被捕获到异常时(catch块内),结束时(fially代码块内)2 Utils工具类的方法通常都是静态的,方便调用*/
public class LogUtils {public static void logStart(Method method,Object ...args){System.out.println("方法【"+ method.getName() +"】开始执行,调用的参数是:" + Arrays.asList(args));}public static void logReturn(Method method,Object result){System.out.println("【"+method.getName()+"】执行完毕" + "返回的结果是:" + result);}public static void logException(Method method,Exception e){System.out.println("【"+method.getName()+"】出现异常" + "异常的原因是:" + e.getCause());}public static void logAfter(Method method){System.out.println("【"+method.getName()+"】结束执行");}
}
3 CaculatorProxy动态代理类
/*
注意:customer才是我们真正要代理的对象,本例中是计算器类(MyCaculator类的对象),我们分别在
核心业务方法的四个位置运行前,运行后,被捕获到异常时(catch块内),结束时(fially代码块内)执行
logUtils的日志方法,打印相关日志信息*/
public class CaculatorProxy {public static Object getProxy(Object customer) {Class clazz = customer.getClass();MyInvocationHandler handler = new MyInvocationHandler();handler.bind(customer);return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),handler);}
}class MyInvocationHandler implements InvocationHandler{Object customer;//和getProxy的参数对象进行绑定public void bind(Object customer){this.customer = customer;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object result = null;try {LogUtils.logStart(method,args);result = method.invoke(customer,args);LogUtils.logReturn(method,args);} catch (Exception e) {LogUtils.logException(method,e);e.printStackTrace();} finally {LogUtils.logAfter(method);}return result;}}
4MyCaculator类
public class MyCaculator implements Caculator {@Overridepublic int add(int op1, int op2) {return op1 + op2;}@Overridepublic int sub(int op1, int op2) {return op1 - op2;}@Overridepublic int mul(int op1, int op2) {return op1 * op2;}@Overridepublic int div(int op1, int op2) {return op1 / op2;}
}
5 测试类
public class Client {public static void main(String[] args) {Caculator proxy = (Caculator) CaculatorProxy.getProxy(new MyCaculator());proxy.add(2,1);proxy.sub(2,1);proxy.div(2,1);proxy.sub(2,1);}
}
运行结果,完美实现日志打印功能
传统动态代理实现计算器类日志功能相关推荐
- 查看动态代理生成的类文件
JDK的动态代理 场景 在数据保存前后加入日志 实例 先定义数据保存接口 interface DataSave{void save(); } 然后定义一个sql拦截器,在数据保存前后打印日志 clas ...
- java使用动态代理来实现AOP(日志记录)的实例代码
AOP(面向方面)的思想,就是把项目共同的那部分功能分离开来,比如日志记录,避免在业务逻辑里面夹杂着跟业务逻辑无关的代码 id="cproIframe_u1892994_2" wi ...
- spring动态代理实现计算器
2019独角兽企业重金招聘Python工程师标准>>> 1.ArithmeticCalculator.java package com.huanlgiusong.spring.aop ...
- java基础5:工厂模式、单例模式、File文件类、递归、IO流、Properties配置文件、网络编程、利用IO流模拟注册登录功能、关于反射、JDK动态代理
1.工厂模式 23种java设计模式之一 1)提供抽象类(基类) 2)提供一些子类,完成方法重写 3)提供一个接口:完成具体子类的实例化对象的创建,不能直接new子类,构造函数私有化. 优点:具体的子 ...
- 第六周 Java语法总结_设计原则_工厂模式_单例模式_代理模式(静态代理_动态代理)_递归_IO流_网络编程(UDP_TCP)_反射_数据库
文章目录 20.设计原则 1.工厂模式 2.单例模式 1)饿汉式 2)懒汉式 3.Runtime类 4.代理模式 1)静态代理 2)动态代理 动态代理模板 21.递归 22.IO流 1.File 2. ...
- 动态代理、CGlib、AOP
Java 代理模式实现方式,主要有如下五种方法 静态代理,工程师编辑代理类代码,实现代理模式:在编译期就生成了代理类. 基于 JDK 实现动态代理,通过jdk提供的工具方法Proxy.newProxy ...
- 动态代理、CGlib、AOP原理分析与实现
Java 代理模式实现方式,主要有如下五种方法 静态代理,工程师编辑代理类代码,实现代理模式:在编译期就生成了代理类. 基于 JDK 实现动态代理,通过jdk提供的工具方法Proxy.newProxy ...
- AOP、动态代理、CGlib(原理实践)
Java 代理模式实现方式,主要有如下五种方法: 1. 静态代理,工程师编辑代理类代码,实现代理模式:在编译期就生成了代理类. 2. 基于 JDK 实现动态代理,通过jdk提供的工具方法Proxy.n ...
- 动态代理竟然如此简单!
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 这篇文章我们来聊一下 Java 中的动态代理. 动态代理在 ...
最新文章
- python连接linux服务器并使用命令_python基于paramiko模块实现远程连接Linux虚拟机(服务器)并执行指定命令返回输出结果...
- mysql ef vs
- Visual Tracking:运行ECO模型
- mysql根据id删除数据sql语句_sql delete根据id删除数据库
- 状压dp之二之三 炮兵阵地/玉米田 By cellur925
- coolite TreeNode NodeClick传id到后台的方法
- java 上传文件及预览_SpringBoot上传下载文件及在线预览
- C语言实现MATLAB 6.5中M文件的方法
- Linux-Ubuntu安装 MySQL
- 10-200-022-使用-概念-并行度Parallelism
- python模拟内置函数all_Python内置all函数详细介绍
- linux配置caffe环境,ubuntu14.04环境下配置caffe
- R语言模拟:Bias Variance Trade-Off
- 通信原理及系统系列7—— 什么是码间串扰
- 基线管理之Windows安全配置
- 大学四年的总结与感受
- MacOS 苹果 快捷键
- KunlunBase集群管理接口
- IPad Pro 2018 Unity 屏幕适配 解决无法全屏问题
- Jquery Md5加密解密
热门文章
- u盘装xp/win7/ubuntu/fedora总结
- 嘉汇舞台工程材料列表(全部自有设备)
- Silverlight使用DataGrid的模板列(DataGridTemplateColumn)实现类似TreeListView控件的效果
- mssql访问 oracle
- Vue -- 指令【学习笔记】(持续更新)
- 从事前端开发必须要了解的CSS原理
- python 大括号中括号小括号的区分
- 7-14 求整数段和 (15 分)
- 7-137 凯撒密码 (20 分)
- asp.net ftp上传文件到服务器,.net 文件上传到服务器上