面向切面编程二

上一篇是对一个具体的类切面编程实现,现在将其抽象出来,利用java的动态代理特性实现切面编程。类图如下
这里写图片描述

定义了Before和After泛型接口,DynamicProxy类实现切面编程功能,继承自InvocationHandler接口。

Before接口

public interface Before<T> {

    public boolean before(T...args);

}

BeforeDivide实现Before接口

public class BeforeDivide implements Before{

    //除法参数的验证
    @Override
    public boolean before(Object... args) {
        if((Integer)args[1]==0)
            return false;
        else
            return true;
    }

}

After接口

public interface After<T> {

    public void after(T...args);

}

AfterDivide实现After接口

public class AfterDivide implements After{

    //输出结果
    @Override
    public void after(Object... args) {
           System.out.println("结果是:"+args[0]);
    }

}

DynamicProxy类

public class DynamicProxy implements InvocationHandler{

    private Object obj;
    private Before be;
    private After af;

    public DynamicProxy(Object obj,Before be,After af){
        this.obj=obj;
        this.be=be;
        this.af=af;
    }

    @SuppressWarnings("unchecked") 
    public <T> T getProxy(){
        return (T) Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
        if(be.before(arg2)==false){
            System.out.println("没有通过验证");
            return 0;
        }

        Object result=arg1.invoke(obj, arg2);

        af.after(result);

        return result;
    }

}

客户端调用

public static void main(String args[]){

        Calculator div=new DynamicProxy(new CalculatorImpl(),
                                      new BeforeDivide(),
                                      new AfterDivide()).getProxy();
        div.divide(1, 1);
    }

利用java动态代理的方法可以实现切面编程,只需要便携before和after接口的实现类,便可以完成自己想要在代码执行前和执行后插入自己想要执行的功能。

posted @ 2016-05-05 11:24  黄大仙爱编程  阅读(92)  评论(0编辑  收藏  举报