`
wangxinxin1212
  • 浏览: 29037 次
社区版块
存档分类
最新评论

java动态代理(AOP)初探

    博客分类:
  • java
阅读更多

       最近在做项目时发现公司的产品都是基于公司搭建好的基础框架进行开发,由于基础框架已经进行了高度封装,这样好处是能够快速开发新功能,但是很快就发现有好多东西都是重复的。于是决定开发一个工具类,用来生成一些固定模版的代码。在写这个工具类时用到了大量的反射技术,为了更好的了解反射技术,便找来几本书来参考,便看到了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("穿");
	}
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics