public void initHasFields(UserSpecifiedRegionAttributes<K, V> other) {
    Field[] thisFields = UserSpecifiedRegionAttributes.class.getDeclaredFields();
    Object[] emptyArgs = new Object[] {};
    int hasCounter = 0;
    String fieldName = null;
    for (final Field thisField : thisFields) {
      fieldName = thisField.getName();
      if (fieldName.startsWith("has")) {
        hasCounter++;
        boolean bval = false;

        try {
          Method otherMeth = other.getClass().getMethod(fieldName/* , (Class[])null */);
          bval = (Boolean) otherMeth.invoke(other, emptyArgs);
        } catch (NoSuchMethodException darnit) {
          Assert.assertTrue(false, "A has* method accessor is required for field " + fieldName);
        } catch (IllegalAccessException boom) {
          Assert.assertTrue(false, "Could not access method " + fieldName + " on " + getClass());
        } catch (IllegalArgumentException e) {
          Assert.assertTrue(false,
              "Illegal argument trying to set field " + e.getLocalizedMessage());
        } catch (InvocationTargetException e) {
          Assert.assertTrue(false, "Failed trying to invoke method " + e.getLocalizedMessage());
        }

        try {
          thisField.setBoolean(this, bval);
        } catch (IllegalAccessException ouch) {
          Assert.assertTrue(false, "Could not access field" + fieldName + " on " + getClass());
        }
      }
    }
    Assert.assertTrue(hasCounter == HAS_COUNT,
        "Expected " + HAS_COUNT + " methods, got " + hasCounter + " last field: " + fieldName);

    // this.hasCacheListeners = other.hasCacheListeners();
    // this.hasCacheLoader = other.hasCacheLoader();
    // this.hasCacheWriter = other.hasCacheWriter();
    // this.hasConcurrencyLevel = other.hasConcurrencyLevel();
    // this.hasDataPolicy = other.hasDataPolicy();
    // this.hasDiskDirs = other.hasDiskDirs();
    // this.hasDiskWriteAttributes = other.hasDiskWriteAttributes();
    // this.hasEarlyAck = other.hasEarlyAck();
    // this.hasEnableAsyncConflation = other.hasEnableAsyncConflation();
    // this.hasEnableSubscriptionConflation = other.hasEnableSubscriptionConflation();
    // this.hasEnableGateway = other.hasEnableGateway();
    // this.hasEntryIdleTimeout = other.hasEntryIdleTimeout();
    // this.hasEntryTimeToLive = other.hasEntryTimeToLive();
    // this.hasEvictionAttributes = other.hasEvictionAttributes();
    // this.hasIgnoreJTA = other.hasIgnoreJTA();
    // this.hasIndexMaintenanceSynchronous = other.hasIndexMaintenanceSynchronous();
    // this.hasInitialCapacity = other.hasInitialCapacity();
    // this.hasIsLockGrantor = other.hasIsLockGrantor();
    // this.hasKeyConstraint = other.hasKeyConstraint();
    // this.hasLoadFactor = other.hasLoadFactor();
    // this.hasMembershipAttributes = other.hasMembershipAttributes();
    // this.hasMulticastEnabled = other.hasMulticastEnabled();
    // this.hasPartitionAttributes = other.hasPartitionAttributes();
    // this.hasPublisher = other.hasPublisher();
    // this.hasRegionIdleTimeout = other.hasRegionIdleTimeout();
    // this.hasRegionTimeToLive = other.hasRegionTimeToLive();
    // this.hasScope = other.hasScope();
    // this.hasStatisticsEnabled = other.hasStatisticsEnabled();
    // this.hasSubscriptionAttributes = other.hasSubscriptionAttributes();
    // this.hasValueConstraint = other.hasValueConstraint();
  }
Holds index information. Hoisted up to this class in 7.0

@since GemFire 6.5
geode-core/src/main/java/org/apache/geode/internal/cache/UserSpecifiedRegionAttributes.java