CGLIb代理

CGLIb代理

JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。

简单的实现举例:

public class CGLibProxy implements MethodInterceptor {
 private Object targetObject;
 public Object CreateProxy(Object obj) {
  this.targetObject = obj;
  Enhancer enhancer = new Enhancer();// 增强类
  enhancer.setSuperclass(targetObject.getClass());// 设置父类
  enhancer.setCallback(this);//
  return enhancer.create(new Class[] { String.class, String.class },
    new Object[] { null, null });// ok
  // return enhancer.create(targetObject.getClass(), this);// ok,需要无参构造
 }
 @Override
 public Object intercept(Object arg0, Method method, Object[] args,
   MethodProxy arg3) throws Throwable {
  // TODO Auto-generated method stub
  System.out.println("\n前置条件及准备工作");
  MyLog mylog = method.getDeclaredAnnotation(MyLog.class);
  Object obj = null;
  if (mylog != null) {
   obj = method.invoke(targetObject, args);
   Student st = (Student) targetObject;
   System.out.println("学生名:" + st.getName() + ",地址:" + st.getAddress()
     + "---被调用了" + method.getName() + "方法");
  } else {
   System.out.println(method.getName() + "方法,没注解");
  }
  System.out.println("后置条件及准备工作\n");
  return obj;
 }
}

注:之前再写的时候发现实体类,必须先生成无参构造,否则报错,超类没有空构造函数,但是没有给出参数,使用上述方法就避免了,他通过实例的有参构造,获取对象.
报错如下:

Exception in thread "main" java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值