最近在做项目时发现公司的产品都是基于公司搭建好的基础框架进行开发,由于基础框架已经进行了高度封装,这样好处是能够快速开发新功能,但是很快就发现有好多东西都是重复的。于是决定开发一个工具类,用来生成一些固定模版的代码。在写这个工具类时用到了大量的反射技术,为了更好的了解反射技术,便找来几本书来参考,便看到了java的AOP(面向切面)。之前有了解过,但是云里雾里的。为了更好的理解面向切面参考《疯狂java系列》自己写了小列子加强对“面向切面”的了解。这个例子很浅,如需要深入研究请参考其他资料。
这个列子是用人类上厕所为列。这里抽象人类上厕所的步骤为3步(1,脱动作,2.采用什么姿势,3,穿动作)。这个例子可能有点俗。人类分为男,女。无论男,女上厕所的步骤都可以抽象成这三个步骤,(1,3)的动作是一样的,但是(2)步可就不一样了。那么问题就来了。怎么在(2)动作的前后执行(1)和(3)步骤呢。下面看代码实现:
主要通过Proxy与InvocationHandler类生成代理
package com.daxingzsh.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * java动态代理 * 面向切面编程 * AOP * @author xinxin * */ public class GoToilot { public static void main(String[] args){ People target1 = new Woman(); People target2 = new Man(); People woman = ProxyFactory.getProxy(target1); People man = ProxyFactory.getProxy(target2); //使用代理生成的对象被切入了业务逻辑 woman.goToilot(); System.out.println("-------------------------"); man.goToilot(); } } /** * 代理工厂 * @author xinxin * */ class ProxyFactory{ @SuppressWarnings("unchecked") public static <T> T getProxy(T target){ MyInvockHander hander = new MyInvockHander(target); return (T)Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), hander); } } /** * 动态代理 * 将处理逻辑切入被代理对象方法 * @author xinxin * */ class MyInvockHander implements InvocationHandler{ private Object target; public MyInvockHander(Object target){ this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { PeopleGoToToilot toToilot = new PeopleGoToToilot(); //在调用被代理对象方法前执行处理逻辑 toToilot.start(); Object result = method.invoke(target, args); //在调用被代理对象方法后执行处理逻辑 toToilot.end(); return result; } } /** * 人类接口 * @author xinxin * */ interface People{ /** * 上厕所抽象方法 */ public void goToilot(); } /** * 女人实现类 * @author xinxin * */ class Woman implements People{ @Override public void goToilot() { System.out.println("女:蹲式"); } } /** * 男人实现类 * @author xinxin * */ class Man implements People{ @Override public void goToilot() { System.out.println("男:站式"); } } /** * 上厕所业务类 * @author xinxin * */ class PeopleGoToToilot{ public void start(){ System.out.println("脱"); } public void end(){ System.out.println("穿"); } }
相关推荐
用Java动态代理实现AOP,讲的很好(用Java动态代理实现AOP)
讲述JAVA的动态代理的原理,以及通过JAVA的动态代理来实现AOP。简洁,易懂,学习AOP的入门级文档
aop java
用java自己实现的动态代理,实现AOP功能
spring之AOP(动态代理),包括jdk动态代理和CGLib动态代理
动态代理 实现简单分页 spring aop 实现简单分页
java-用Java动态代理实现AOP.pdf
Java动态代理在AOP中的应用,薄栋,邓芳,AOP(Aspect-Oriented-programming)是一种支持横切关注点的分解的技术,表达更高的抽象层次。它对于横切关注点就像面向对象程序设计对于对象�
2022年Java动态代理实现AOPJava教程.docx
本文首先介绍了AOP 的基本思想,然后针对它在JAVA 语言 中的实现,具体介绍了JAVA 的动态代理来怎样实现一个简单的AOP 容器