如何通过 Reflection API 复制对象?

Ale*_*lex 4 java reflection

我想通过创建对象的副本Reflection API。这是我的代码:

private <T> T copy(T entity) throws IllegalAccessException, InstantiationException {
    List<Field> fields = new ArrayList<Field>();
    Field[] retrievedFields = entity.getClass().getDeclaredFields();
    for (Field field : retrievedFields) {
        fields.add(field);
    }
    T newEntity = (T) entity.getClass().newInstance();
    for (Field field : fields) {
        field.setAccessible(true);
        field.set(newEntity, field.get(entity));
    }
    return newEntity;
}
Run Code Online (Sandbox Code Playgroud)

但我不知道如何获取字段的值。

Man*_*dan 6

您可以使用 superClass 来获取 superClass。“Object”将是所有类的超类。对象的超类为空。您可以检查“Object”或 null 来终止条件。无论如何,对象的声明字段不会返回任何内容。

private <T> T copy(T entity) throws IllegalAccessException, InstantiationException {
    Class<?> clazz = entity.getClass();
    T newEntity = (T) entity.getClass().newInstance();

    while (clazz != null) {
        copyFields(entity, newEntity, clazz);
        clazz = clazz.getSuperclass();
    }

    return newEntity;
}

private <T> T copyFields(T entity, T newEntity, Class<?> clazz) throws IllegalAccessException {
    List<Field> fields = new ArrayList<>();
    for (Field field : clazz.getDeclaredFields()) {
        fields.add(field);
    }
    for (Field field : fields) {
        field.setAccessible(true);
        field.set(newEntity, field.get(entity));
    }
    return newEntity;
}
Run Code Online (Sandbox Code Playgroud)