需要cglib.jar asm.jar
最近在设计一个框架,想实现和spring相同的声明式事务功能,于是研究了一下cglib,cglib好处是针对普通java方法,不需要JDK的动态代理那样一定要实现接口方法。
这样框架就可以对任意java方法进行AOP操作,比如自动的事务管理,见下面代码:
import java.util.ArrayList;
import java.util.List;
import net.sf.cglib.proxy.*;
/**
* 方法动态代理
*/
public class TransactionProxy implements MethodInterceptor {
private String methodName = "";
public Object newInstance(Class clazz ,String methodName){
try{
this.methodName = methodName;
Enhancer e = new Enhancer();
e.setSuperclass(clazz);
e.setCallback(this);
return e.create();
}catch(Throwable e ){
e.printStackTrace();
throw new Error(e.getMessage());
}
}
public Object intercept(Object obj, java.lang.reflect.Method method, Object[] args, MethodProxy proxy) throws Throwable {
Object retValFromSuper = null;
if(method.getName().equals(methodName)){
try {
System.out.println("<======前处理 比如开始事务=========>");
retValFromSuper = proxy.invokeSuper(obj, args);
System.out.println("<======后处理 比如提交事务=========>");
}catch(Throwable t){
System.out.println("throw "+t);
throw t.fillInStackTrace();
}finally{
System.out.println("<======结束处理 比如结束事务=========>");
}
}else{
retValFromSuper = proxy.invokeSuper(obj, args);
}
return retValFromSuper;
}
public static void main(String[] args){
List list = (ArrayList)new TransactionProxy().newInstance(ArrayList.class, "add");//表明只针对add方法进行动态代理
list.add("测试");
System.out.println(list.get(0));
}
}