Aop是面向切面的编程,我的理解就是给他套包装,一层套一层。
首先来看看如何返回一个对象的代理。
package agint;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 打印日志
* @author Administrator
*
*/
public class ShowLogHanlder implements InvocationHandler{
/**
* 目标对象
*/
private Object target;
/**
* 代理初始化
* @param target
* @return
*/
public static Object initNextAngient( Object target){
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new ShowLogHanlder(target));
}
public ShowLogHanlder(Object target) {
super();
this.target = target;
}
/**
* 自己的代理逻辑实现
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("计算开始");
Object obj=method.invoke(target, args);
System.out.println("计算结束");
return obj;
}
}
这个类的目的是调用其中静态的initNextAngient返回目标对象的代理。
如何实现多个代理对象的嵌套呢
package agint;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ChackValueHanlder implements InvocationHandler{
private Object target;
public static Object initNextAngient( Object target){
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new ChackValueHanlder(target));
}
public ChackValueHanlder(Object target){
this.target=target;
}
public void CheakValue(Object obj){
double value=(Double) obj;
if(value<0){
System.out.println("数据必须大于0");
}else{
System.out.println("数据合法");
}
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
for(Object obj:args){
CheakValue(obj);
}
try {
return method.invoke(target, args);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
上边的两个均是代理对象。嵌套代理只需下面代码实现即可
ShowLogHanlder.initNextAngient(ChackValueHanlder.initNextAngient(calucateImpl))