Package us.codecraft.tinyioc.aop

Source Code of us.codecraft.tinyioc.aop.Cglib2AopProxy$CglibMethodInvocation

package us.codecraft.tinyioc.aop;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
* @author yihua.huang@dianping.com
*/
public class Cglib2AopProxy extends AbstractAopProxy {

  public Cglib2AopProxy(AdvisedSupport advised) {
    super(advised);
  }

  @Override
  public Object getProxy() {
    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(advised.getTargetSource().getTargetClass());
    enhancer.setInterfaces(advised.getTargetSource().getInterfaces());
    enhancer.setCallback(new DynamicAdvisedInterceptor(advised));
    Object enhanced = enhancer.create();
    return enhanced;
  }

  private static class DynamicAdvisedInterceptor implements MethodInterceptor {

    private AdvisedSupport advised;

    private org.aopalliance.intercept.MethodInterceptor delegateMethodInterceptor;

    private DynamicAdvisedInterceptor(AdvisedSupport advised) {
      this.advised = advised;
      this.delegateMethodInterceptor = advised.getMethodInterceptor();
    }

    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
      if (advised.getMethodMatcher() == null
          || advised.getMethodMatcher().matches(method, advised.getTargetSource().getTargetClass())) {
        return delegateMethodInterceptor.invoke(new CglibMethodInvocation(advised.getTargetSource().getTarget(), method, args, proxy));
      }
      return new CglibMethodInvocation(advised.getTargetSource().getTarget(), method, args, proxy).proceed();
    }
  }

  private static class CglibMethodInvocation extends ReflectiveMethodInvocation {

    private final MethodProxy methodProxy;

    public CglibMethodInvocation(Object target, Method method, Object[] args, MethodProxy methodProxy) {
      super(target, method, args);
      this.methodProxy = methodProxy;
    }

    @Override
    public Object proceed() throws Throwable {
      return this.methodProxy.invoke(this.target, this.arguments);
    }
  }

}
TOP

Related Classes of us.codecraft.tinyioc.aop.Cglib2AopProxy$CglibMethodInvocation

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.