code: private Object doGetFieldValue(String fullField, String field, Object object, boolean useCache,
              Map<String, ReflectInfo> cachedFields) {
          // check cache
          Field f;
          if (useCache) {
              ReflectInfo info = cachedFields.get(fullField);
              if (info != null) {
                  return getField(info.target, info.field);
              }
          }
  
          int index = field.indexOf('.');
          if (index != -1) {
              String parent = field.substring(0, index);
              String sub = field.substring(index + 1);
  
              try {
                  f = FieldUtils.findField(object.getClass(), parent);
                  if (f == null) {
                      throw new RuntimeException(
                              "No field '" + parent + "' found at class " + object.getClass().getName());
                  }
                  f.setAccessible(true);
                  Object o = f.get(object);
                  if (o == null) {
                      return null;
                  }
                  return get(fullField, sub, o);
              } catch (Exception e) {
                  throw new RuntimeException(e.getMessage(), e);
              }
          }
  
          f = FieldUtils.findField(object.getClass(), field);
          if (f == null) {
              throw new RuntimeException("No field '" + field + "' found at class " + object.getClass().getName());
          }
          if (useCache && !cachedFields.containsKey(fullField)) {
              cachedFields.put(fullField, new ReflectInfo(f, object));
          }
          return getField(object, f);
      }
docs: Do get field value.
  
  @param fullField the full field
  @param field the field
  @param object the object
  @param useCache the use cache
  @param cachedFields the cached fields
  @return the object