使用动态代理解决上述问题

代理设计模式的原理: 使用一个代理将对象包装起来, 然后用该代理对象取代原始对象. 任何对原始对象的调用都要通过代理. 代理对象决定是否以及何时将方法调用转到原始对象上.

package com.learn.spring.aop;public interface ArithmeticCalculator {public  int add(int i, int j );public  int sub(int i, int j );public  int mul(int i, int j );public  int div(int i, int j );
}
package com.learn.spring.aop;public class ArithmeticCalculatorImpl implements ArithmeticCalculator {@Overridepublic int add(int i, int j) {int result = i + j ;return result;}@Overridepublic int sub(int i, int j) {int result = i - j ;return result; }@Overridepublic int mul(int i, int j) {int result = i * j ;return result;}@Overridepublic int div(int i, int j) {int result = i / j ;return result;}}
package com.learn.spring.aop;public class ArithmeticCalculatorLoggingImpl implements ArithmeticCalculator {@Overridepublic int add(int i, int j) {//System.out.println("learn==>The method add begins with ["+i+","+j+"]");int result = i + j ;//System.out.println("learn==>The method add ends with "+ result );return result;}@Overridepublic int sub(int i, int j) {System.out.println("learn==>The method sub begins with ["+i+","+j+"]");int result = i - j ;System.out.println("learn==>The method sub ends with "+ result );return result;    }@Overridepublic int mul(int i, int j) {System.out.println("learn==>The method mul begins with ["+i+","+j+"]");int result = i * j ;System.out.println("learn==>The method mul ends with "+ result );return result;}@Overridepublic int div(int i, int j) {System.out.println("learn==>The method div begins with ["+i+","+j+"]");int result = i / j ;System.out.println("learn==>The method div ends with "+ result );return result;}}
package com.learn.spring.aop;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;//代理类
public class ArithmeticCalculatorLoggingProxy {//1.被代理的对象  目标对象private ArithmeticCalculator target ; // 实际上是ArithmeticCalculatorImpl对象.//通过构造器的方式将目标对象传入public ArithmeticCalculatorLoggingProxy(ArithmeticCalculator target){this.target = target ;}//获取代理对象public ArithmeticCalculator getLoggingProxy(){//定义代理对象ArithmeticCalculator proxy ;/*** loader:  ClassLoader 类加载器* interfaces:  目标类的所有接口,目的是获取接口中的方法* h: InvocationHandler*/ClassLoader loader = target.getClass().getClassLoader();Class[] interfaces = target.getClass().getInterfaces();InvocationHandler h = new InvocationHandler() {/*** proxy:代理对象   在invoke方法中一般不会用* method:正在调用的方法* args:调用方法传入的参数*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {String methodName = method.getName();//加日志System.out.println("learn===>The method "+methodName+" begins with "+ Arrays.asList(args));//执行目标方法Object result = method.invoke(target, args);//加日志System.out.println("learn===>The method "+methodName+" ends with " + result );return result;}};proxy = (ArithmeticCalculator)Proxy.newProxyInstance(loader, interfaces, h);return proxy ;}}
package com.learn.spring.aop;public class Main {public static void main(String[] args) {//目标对象ArithmeticCalculator target = new ArithmeticCalculatorImpl();//获取代理对象ArithmeticCalculator  proxy = new ArithmeticCalculatorLoggingProxy(target).getLoggingProxy();System.out.println("proxy:" + proxy.getClass().getName());int result = proxy.add(1, 1);   // 实际上要去执行invoke方法System.out.println("result=====>"+result);}
}

Aop动态代理解决问题相关推荐

  1. AOP动态代理的实现机制

    2019独角兽企业重金招聘Python工程师标准>>> 1 AOP各种的实现 AOP就是面向切面编程,我们可以从几个层面来实现AOP. 在编译器修改源代码,在运行期字节码加载前修改字 ...

  2. spring中AOP动态代理的两种方式

    AOP动态代理的两种方式 Spring AOP动态代理的方式(spring的AOP默认是JDK Proxy) 浅谈这两种动态代理 JDK的动态代理,需要有实现接口 动态代理--JDK Proxy ⚫ ...

  3. Spring AOP源码解析——AOP动态代理原理和实现方式

    2019独角兽企业重金招聘Python工程师标准>>> Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和 ...

  4. Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题

    Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题 参考文章: (1)Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代 ...

  5. Spring AOP动态代理

    导入依赖: <dependency><groupId>org.springframework</groupId><artifactId>spring-a ...

  6. AOP||动态代理||AOP专业术语;

    AOP:(Aspect Oriented Programming)面向切面编程: OOP:(Object Oriented Programming )面向对象编程: 面向切面编程:基于OOP基础之上新 ...

  7. [Spring手撸专栏学习笔记]——把AOP动态代理,融入到Bean的生命周期

    本文是学习<Spring 手撸专栏>第 10 章笔记,主要记录我的一些debug调试过程,方便后期复习.具体学习,大家可以去看一下这个专栏,强烈推荐. 方案 其实在有了AOP的核心功能实现 ...

  8. Spring之AOP动态代理详解

    动态代理 动态代理和静态代理角色一样 动态代理类是动态生成的,不是我们直接写好的. 动态代理分为两大类:基于接口的动态代理:JDK动态代理[我们在这里使用]基于类的动态代理:cglibjava字节码: ...

  9. spring aop 动态代理模拟

    CGLIB 动态代理 public class HouserHost { public void rentHouse() { System.out.println("出租房屋了") ...

最新文章

  1. Xilinx基于模型的设计工具—Model Composer
  2. LeetCode Factorial Trailing Zeroes(计算阶乘结果尾部有几个0)
  3. MySql的安装、配置(转)
  4. 关于SQL的几个备忘
  5. Keras MNIST
  6. 高并发负载均衡(一):网络协议原理
  7. LeetCode之Happy Number
  8. urlconnection java_java成神之——HttpURLConnection访问api
  9. java求指数与对数
  10. Http协议规范及格式
  11. qt中将数据存入文档再读出------------ writeRawData 与readRawData成对使用
  12. 通过高德地图获取 经纬度 以及地理位置等
  13. 港交所、中芯国际、京东、诺基亚等公司高管变动
  14. 三角形度数计算机公式,三角形角度计算公式
  15. [proxy:0:0@WORKSTATION-DEV] HYDU_sock_write (utils/sock/sock.c:256): write error (Broken pipe)
  16. 出现Ncat: bind to 0.0.0.0:9999: Address already in use. QUITTING.如何解决?
  17. cad修改快捷键_【扮家家云渲染】CAD快捷键修改干货教程
  18. RPA 项目经验分享
  19. MES系统价格具体跟哪些因素相关?
  20. EventLog Analyzer应用程序日志管理

热门文章

  1. EasyUI 分页 偶遇 问题
  2. VS2010-MFC(对话框:一般属性页对话框的创建及显示)
  3. C 冒泡排序及其非常非常非常简单的优化
  4. 步步为营-19-正则表达式的简单应用
  5. spark 存储机制详解
  6. 【译】 WebSocket 协议第六章——发送与接收消息(Sending and Receiving Data)
  7. PHP实现二维码扫码登录
  8. easyui tab
  9. 开发者应如何看待iOS平台和Android平台
  10. 模仿网易(163)首页Ajax功能中的鼠标延时触发