protected void copyDeclaredFields()

in src/main/java/com/googlesource/gerrit/plugins/task/TaskConfig.java [95:122]


    protected <T> void copyDeclaredFields(Class<T> cls, T from) {
      for (Field field : cls.getDeclaredFields()) {
        try {
          field.setAccessible(true);
          Class<?> fieldCls = field.getType();
          Object val = field.get(from);
          if (field.getType().isPrimitive()
              || Primitives.isWrapperType(fieldCls)
              || (val instanceof String)
              || val == null) {
            field.set(this, val);
          } else if (val instanceof List) {
            List<?> list = List.class.cast(val);
            field.set(this, new ArrayList<>(list));
          } else if (val instanceof Map) {
            Map<?, ?> map = Map.class.cast(val);
            field.set(this, new HashMap<>(map));
          } else if (field.getName().equals("this$0")) { // Don't copy internal final field
          } else {
            throw new RuntimeException(
                "Don't know how to deep copy " + fieldValueToString(field, val));
          }
        } catch (IllegalAccessException e) {
          throw new RuntimeException(
              "Cannot access field to copy it " + fieldValueToString(field, "unknown"));
        }
      }
    }