面向切面编程:
这是最近接触到的思想。看名字感觉很新奇,其实就是在底层实现拦截调用。通俗点,如果你不小心踩到狗屎,心理不平衡时,你可以在人人都会走过的路上放一坨狗屎,这样,路过的人都会踩到狗屎。这样你就实现了面向切面编程(个人理解)。
关键字:切面,拦截。
用途:操作日志,权限验证等。
百度下别人的例子然后,自己手动敲一遍代码。下面用一个字符串列表实现一个操作日志功能demo.用动态代理模式实现拦截。
老规矩接口先走,数据操作接口
public interface DataOperationable {
public void add(Object object);
public void edit(int k,Object object);
public void delete(Object object);
public void queryLength();
}
具体执行者
public class DataOperation implements DataOperationable{
private List list;
public DataOperation(List list) {
// TODO Auto-generated constructor stub
this.list=list;
}
@Override
public void add(Object object) {
// TODO Auto-generated method stub
this.list.add(object);
}
@Override
public void edit(int k,Object object) {
// TODO Auto-generated method stub
this.list.set(k, object);
}
@Override
public void delete(Object object) {
// TODO Auto-generated method stub
this.list.remove(object);
}
@Override
public void queryLength() {
// TODO Auto-generated method stub
System.out.print(this.list.size()+"") ;
}
}
动态代理
public class MyProxy implements InvocationHandler{
private Object target;
public MyProxy(Object object) {
// TODO Auto-generated constructor stub
this.target=object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
Object result;
result=method.invoke(this.target, args);
System.out.println(method.getName()+"操作:"+Arrays.toString(args));
return result;
}
/**
*
* 动态生成该target对象接口的代理类
* */
public Object getProxy()
{
return Proxy.newProxyInstance(this.target.getClass().getClassLoader(), this.target.getClass().getInterfaces(),this);
}
}
调用过程
public class Mian {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String>list=new ArrayList<String>();
list.add("xxx");
list.add("ooo");
DataOperationable operationable=(DataOperationable)( new MyProxy(new DataOperation(list)).getProxy());
operationable.add("eee");
operationable.add("dddd");
operationable.delete("xxx");
operationable.edit(1, "2222");
}
}
运行结果
add操作:[eee]
add操作:[dddd]
delete操作:[xxx]
edit操作:[1, 2222]