java动态代理(AOP)初探
2015-08-28 23:12
381 查看
最近在做项目时发现公司的产品都是基于公司搭建好的基础框架进行开发,由于基础框架已经进行了高度封装,这样好处是能够快速开发新功能,但是很快就发现有好多东西都是重复的。于是决定开发一个工具类,用来生成一些固定模版的代码。在写这个工具类时用到了大量的反射技术,为了更好的了解反射技术,便找来几本书来参考,便看到了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 动态代理实现AOP
- Java动态代理-->Spring AOP
- AOP:java动态代理+反射机制
- JAVA动态代理和方法拦截(使用CGLib实现AOP、方法拦截、委托)
- [Java]Spring AOP基础知识-动态代理
- Java动态代理-->Spring AOP
- 用Java动态代理实现AOP
- JAVA AOP编程之动态代理技术
- 使用Java动态代理技术实现AOP
- Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)
- Java动态代理模式jdk和cglib的2种实现以及二者的区别(AOP面向切面的前奏)
- 使用Java 动态代理实现AOP
- Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)
- Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)
- java动态代理与AOP
- 深入AOP开发的基石 java动态代理
- java动态代理_aop