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);}
}

运行结果,完美实现日志打印功能

传统动态代理实现计算器类日志功能相关推荐

  1. 查看动态代理生成的类文件

    JDK的动态代理 场景 在数据保存前后加入日志 实例 先定义数据保存接口 interface DataSave{void save(); } 然后定义一个sql拦截器,在数据保存前后打印日志 clas ...

  2. java使用动态代理来实现AOP(日志记录)的实例代码

    AOP(面向方面)的思想,就是把项目共同的那部分功能分离开来,比如日志记录,避免在业务逻辑里面夹杂着跟业务逻辑无关的代码 id="cproIframe_u1892994_2" wi ...

  3. spring动态代理实现计算器

    2019独角兽企业重金招聘Python工程师标准>>> 1.ArithmeticCalculator.java package com.huanlgiusong.spring.aop ...

  4. java基础5:工厂模式、单例模式、File文件类、递归、IO流、Properties配置文件、网络编程、利用IO流模拟注册登录功能、关于反射、JDK动态代理

    1.工厂模式 23种java设计模式之一 1)提供抽象类(基类) 2)提供一些子类,完成方法重写 3)提供一个接口:完成具体子类的实例化对象的创建,不能直接new子类,构造函数私有化. 优点:具体的子 ...

  5. 第六周 Java语法总结_设计原则_工厂模式_单例模式_代理模式(静态代理_动态代理)_递归_IO流_网络编程(UDP_TCP)_反射_数据库

    文章目录 20.设计原则 1.工厂模式 2.单例模式 1)饿汉式 2)懒汉式 3.Runtime类 4.代理模式 1)静态代理 2)动态代理 动态代理模板 21.递归 22.IO流 1.File 2. ...

  6. 动态代理、CGlib、AOP

    Java 代理模式实现方式,主要有如下五种方法 静态代理,工程师编辑代理类代码,实现代理模式:在编译期就生成了代理类. 基于 JDK 实现动态代理,通过jdk提供的工具方法Proxy.newProxy ...

  7. 动态代理、CGlib、AOP原理分析与实现

    Java 代理模式实现方式,主要有如下五种方法 静态代理,工程师编辑代理类代码,实现代理模式:在编译期就生成了代理类. 基于 JDK 实现动态代理,通过jdk提供的工具方法Proxy.newProxy ...

  8. AOP、动态代理、CGlib(原理实践)

    Java 代理模式实现方式,主要有如下五种方法: 1. 静态代理,工程师编辑代理类代码,实现代理模式:在编译期就生成了代理类. 2. 基于 JDK 实现动态代理,通过jdk提供的工具方法Proxy.n ...

  9. 动态代理竟然如此简单!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 这篇文章我们来聊一下 Java 中的动态代理. 动态代理在 ...

最新文章

  1. python连接linux服务器并使用命令_python基于paramiko模块实现远程连接Linux虚拟机(服务器)并执行指定命令返回输出结果...
  2. mysql ef vs
  3. Visual Tracking:运行ECO模型
  4. mysql根据id删除数据sql语句_sql delete根据id删除数据库
  5. 状压dp之二之三 炮兵阵地/玉米田 By cellur925
  6. coolite TreeNode NodeClick传id到后台的方法
  7. java 上传文件及预览_SpringBoot上传下载文件及在线预览
  8. C语言实现MATLAB 6.5中M文件的方法
  9. Linux-Ubuntu安装 MySQL
  10. 10-200-022-使用-概念-并行度Parallelism
  11. python模拟内置函数all_Python内置all函数详细介绍
  12. linux配置caffe环境,ubuntu14.04环境下配置caffe
  13. R语言模拟:Bias Variance Trade-Off
  14. 通信原理及系统系列7—— 什么是码间串扰
  15. 基线管理之Windows安全配置
  16. 大学四年的总结与感受
  17. MacOS 苹果 快捷键
  18. KunlunBase集群管理接口
  19. IPad Pro 2018 Unity 屏幕适配 解决无法全屏问题
  20. Jquery Md5加密解密

热门文章

  1. u盘装xp/win7/ubuntu/fedora总结
  2. 嘉汇舞台工程材料列表(全部自有设备)
  3. Silverlight使用DataGrid的模板列(DataGridTemplateColumn)实现类似TreeListView控件的效果
  4. mssql访问 oracle
  5. Vue -- 指令【学习笔记】(持续更新)
  6. 从事前端开发必须要了解的CSS原理
  7. python 大括号中括号小括号的区分
  8. 7-14 求整数段和 (15 分)
  9. 7-137 凯撒密码 (20 分)
  10. asp.net ftp上传文件到服务器,.net 文件上传到服务器上