@Override
  public Object intercept(
      final Object proxy, final Method method, final Object[] args, final MethodProxy methodProxy)
      throws Throwable {
    final String methodName = method.getName();

    if (logger.isDebugEnabled()) {
      logger.debug(
          "Intercept  ModelInterceptor : " + method.getName() + " " + methodProxy.getSuperName());
    }

    if (methodName.startsWith("set")) {
      final Field property = FieldUtils.getField(model.getClass(), methodName.substring(3));

      if (property != null
          && (args != null && args.length == 1)
          && !property.isAnnotationPresent(Transient.class)) {
        final String propertyName = property.getName().toUpperCase();

        final BaseModel baseModel = (BaseModel) model;

        final Set<String> m$aop = baseModel.getM$aop();

        if (!m$aop.contains(propertyName)) {
          if (!createdByInstance) { // 如果是用类名创建代理时,只要是赋过值,就算变更
            baseModel.addM$aop(propertyName);
          } else {
            final Object originValue = FieldUtils.readField(model, property);

            if (!ObjectUtils.isEquals(originValue, args[0])) {
              baseModel.addM$aop(propertyName);
            }
          }
        }
      }
    }

    if ("finalize".equals(methodName)) {
      model = null;
      return methodProxy.invokeSuper(proxy, args);
    } else {
      return MethodUtils.invokeMethod(model, method, args);
    }
  }