cglib
动态代理,cglib 方式实现(区别于JDK的动态代理)
asm 技术,为一个类创建子类
以一个具体的使用场景开始,CGLib 实现动态代理。
一个普通的 class
public class PayHandler {
public String pay(String odn){
return odn + " 支付完成";
}
}
CGlib 来代理这个类
public class PayProxy implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("cglib 代理 - before");
Object oj =methodProxy.invokeSuper(o,objects);
System.out.println("cglib 代理 - after,已发出短信 ... ... ");
return oj;
}
}
访问PayHandler,其实只需要访问代理类即可
main(){
Properties p = new Properties();
p.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY,"D:\class");
System.setProperties(p); // cglib 生成的class 文件 放到磁盘中
String odn="19-04-2022";
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(PayHandler.class);
enhancer.setCallback(new PayProxy());
PayHandler ph = (PayHandler)enhancer.create();
String pr = ph.pay(odn);
System.out.println(pr);
}
至此,看到cglib 很神奇,带着好奇心走下去,解开 cglib的什么面纱 。