@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;
 }