code: private Method setupSetterOrGetter(Class targetClass,
              HashMap<Class, HashMap<String, Method>> propertyMapMap,
              String prefix, Class valueType) {
          Method setterOrGetter = null;
          try {
              // Have to lock property map prior to reading it, to guard against
              // another thread putting something in there after we've checked it
              // but before we've added an entry to it
              mPropertyMapLock.writeLock().lock();
              HashMap<String, Method> propertyMap = propertyMapMap.get(targetClass);
              if (propertyMap != null) {
                  setterOrGetter = propertyMap.get(mPropertyName);
              }
              if (setterOrGetter == null) {
                  setterOrGetter = getPropertyFunction(targetClass, prefix, valueType);
                  if (propertyMap == null) {
                      propertyMap = new HashMap<String, Method>();
                      propertyMapMap.put(targetClass, propertyMap);
                  }
                  propertyMap.put(mPropertyName, setterOrGetter);
              }
          } finally {
              mPropertyMapLock.writeLock().unlock();
          }
          return setterOrGetter;
      }
docs: Returns the setter or getter requested. This utility function checks whether the
  requested method exists in the propertyMapMap cache. If not, it calls another
  utility function to request the Method from the targetClass directly.
  @param targetClass The Class on which the requested method should exist.
  @param propertyMapMap The cache of setters/getters derived so far.
  @param prefix "set" or "get", for the setter or getter.
  @param valueType The type of parameter passed into the method (null for getter).
  @return Method the method associated with mPropertyName.