面向切面编程二
上一篇是对一个具体的类切面编程实现,现在将其抽象出来,利用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接口的实现类,便可以完成自己想要在代码执行前和执行后插入自己想要执行的功能。