/**
   * Equality means interfaces, advisors and TargetSource are equal.
   *
   * <p>The compared object may be a JdkDynamicAopProxy instance itself or a dynamic proxy wrapping
   * a JdkDynamicAopProxy instance.
   */
  public boolean equals(Object other) {
    if (other == this) {
      return true;
    }
    if (other == null) {
      return false;
    }

    JdkDynamicAopProxy otherProxy = null;
    if (other instanceof JdkDynamicAopProxy) {
      otherProxy = (JdkDynamicAopProxy) other;
    } else if (Proxy.isProxyClass(other.getClass())) {
      InvocationHandler ih = Proxy.getInvocationHandler(other);
      if (!(ih instanceof JdkDynamicAopProxy)) {
        return false;
      }
      otherProxy = (JdkDynamicAopProxy) ih;
    } else {
      // Not a valid comparison...
      return false;
    }

    // If we get here, aopr2 is the other AopProxy.
    return AopProxyUtils.equalsInProxy(this.advised, otherProxy.advised);
  }
 public Object getProxy(ClassLoader classLoader) {
   if (logger.isDebugEnabled()) {
     logger.debug(
         "Creating JDK dynamic proxy: target source is " + this.advised.getTargetSource());
   }
   Class[] proxiedInterfaces = AopProxyUtils.completeProxiedInterfaces(this.advised);
   findDefinedEqualsAndHashCodeMethods(proxiedInterfaces);
   return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this);
 }
Пример #3
0
 @Override
 public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)
     throws Throwable {
   Object oldProxy = null;
   boolean setProxyContext = false;
   Class<?> targetClass = null;
   Object target = null;
   try {
     if (this.advised.exposeProxy) {
       // Make invocation available if necessary.
       oldProxy = AopContext.setCurrentProxy(proxy);
       setProxyContext = true;
     }
     // May be null. Get as late as possible to minimize the time we
     // "own" the target, in case it comes from a pool...
     target = getTarget();
     if (target != null) {
       targetClass = target.getClass();
     }
     List<Object> chain =
         this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);
     Object retVal;
     // Check whether we only have one InvokerInterceptor: that is,
     // no real advice, but just reflective invocation of the target.
     if (chain.isEmpty() && Modifier.isPublic(method.getModifiers())) {
       // We can skip creating a MethodInvocation: just invoke the target directly.
       // Note that the final invoker must be an InvokerInterceptor, so we know
       // it does nothing but a reflective operation on the target, and no hot
       // swapping or fancy proxying.
       Object[] argsToUse = AopProxyUtils.adaptArgumentsIfNecessary(method, args);
       retVal = methodProxy.invoke(target, argsToUse);
     } else {
       // We need to create a method invocation...
       retVal =
           new CglibMethodInvocation(
                   proxy, target, method, args, targetClass, chain, methodProxy)
               .proceed();
     }
     retVal = processReturnType(proxy, target, method, retVal);
     return retVal;
   } finally {
     if (target != null) {
       releaseTarget(target);
     }
     if (setProxyContext) {
       // Restore old proxy.
       AopContext.setCurrentProxy(oldProxy);
     }
   }
 }
Пример #4
0
 @Override
 public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) {
   Object other = args[0];
   if (proxy == other) {
     return true;
   }
   if (other instanceof Factory) {
     Callback callback = ((Factory) other).getCallback(INVOKE_EQUALS);
     if (!(callback instanceof EqualsInterceptor)) {
       return false;
     }
     AdvisedSupport otherAdvised = ((EqualsInterceptor) callback).advised;
     return AopProxyUtils.equalsInProxy(this.advised, otherAdvised);
   } else {
     return false;
   }
 }
Пример #5
0
 @Override
 public boolean equals(Object other) {
   if (this == other) {
     return true;
   }
   if (!(other instanceof ProxyCallbackFilter)) {
     return false;
   }
   ProxyCallbackFilter otherCallbackFilter = (ProxyCallbackFilter) other;
   AdvisedSupport otherAdvised = otherCallbackFilter.advised;
   if (this.advised == null || otherAdvised == null) {
     return false;
   }
   if (this.advised.isFrozen() != otherAdvised.isFrozen()) {
     return false;
   }
   if (this.advised.isExposeProxy() != otherAdvised.isExposeProxy()) {
     return false;
   }
   if (this.advised.getTargetSource().isStatic() != otherAdvised.getTargetSource().isStatic()) {
     return false;
   }
   if (!AopProxyUtils.equalsProxiedInterfaces(this.advised, otherAdvised)) {
     return false;
   }
   // Advice instance identity is unimportant to the proxy class:
   // All that matters is type and ordering.
   Advisor[] thisAdvisors = this.advised.getAdvisors();
   Advisor[] thatAdvisors = otherAdvised.getAdvisors();
   if (thisAdvisors.length != thatAdvisors.length) {
     return false;
   }
   for (int i = 0; i < thisAdvisors.length; i++) {
     Advisor thisAdvisor = thisAdvisors[i];
     Advisor thatAdvisor = thatAdvisors[i];
     if (!equalsAdviceClasses(thisAdvisor, thatAdvisor)) {
       return false;
     }
     if (!equalsPointcuts(thisAdvisor, thatAdvisor)) {
       return false;
     }
   }
   return true;
 }
Пример #6
0
 @Override
 public boolean equals(Object other) {
   return (this == other
       || (other instanceof CglibAopProxy
           && AopProxyUtils.equalsInProxy(this.advised, ((CglibAopProxy) other).advised)));
 }
Пример #7
0
  @Override
  public Object getProxy(ClassLoader classLoader) {
    if (logger.isDebugEnabled()) {
      logger.debug("Creating CGLIB proxy: target source is " + this.advised.getTargetSource());
    }

    try {
      Class<?> rootClass = this.advised.getTargetClass();
      Assert.state(rootClass != null, "Target class must be available for creating a CGLIB proxy");

      Class<?> proxySuperClass = rootClass;
      if (ClassUtils.isCglibProxyClass(rootClass)) {
        proxySuperClass = rootClass.getSuperclass();
        Class<?>[] additionalInterfaces = rootClass.getInterfaces();
        for (Class<?> additionalInterface : additionalInterfaces) {
          this.advised.addInterface(additionalInterface);
        }
      }

      // Validate the class, writing log messages as necessary.
      validateClassIfNecessary(proxySuperClass, classLoader);

      // Configure CGLIB Enhancer...
      Enhancer enhancer = createEnhancer();
      if (classLoader != null) {
        enhancer.setClassLoader(classLoader);
        if (classLoader instanceof SmartClassLoader
            && ((SmartClassLoader) classLoader).isClassReloadable(proxySuperClass)) {
          enhancer.setUseCache(false);
        }
      }
      enhancer.setSuperclass(proxySuperClass);
      enhancer.setInterfaces(AopProxyUtils.completeProxiedInterfaces(this.advised));
      enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE);
      enhancer.setStrategy(new ClassLoaderAwareUndeclaredThrowableStrategy(classLoader));

      Callback[] callbacks = getCallbacks(rootClass);
      Class<?>[] types = new Class<?>[callbacks.length];
      for (int x = 0; x < types.length; x++) {
        types[x] = callbacks[x].getClass();
      }
      // fixedInterceptorMap only populated at this point, after getCallbacks call above
      enhancer.setCallbackFilter(
          new ProxyCallbackFilter(
              this.advised.getConfigurationOnlyCopy(),
              this.fixedInterceptorMap,
              this.fixedInterceptorOffset));
      enhancer.setCallbackTypes(types);

      // Generate the proxy class and create a proxy instance.
      return createProxyClassAndInstance(enhancer, callbacks);
    } catch (CodeGenerationException ex) {
      throw new AopConfigException(
          "Could not generate CGLIB subclass of class ["
              + this.advised.getTargetClass()
              + "]: "
              + "Common causes of this problem include using a final class or a non-visible class",
          ex);
    } catch (IllegalArgumentException ex) {
      throw new AopConfigException(
          "Could not generate CGLIB subclass of class ["
              + this.advised.getTargetClass()
              + "]: "
              + "Common causes of this problem include using a final class or a non-visible class",
          ex);
    } catch (Exception ex) {
      // TargetSource.getTarget() failed
      throw new AopConfigException("Unexpected AOP exception", ex);
    }
  }