如何通过Reflection API制作对象副本?

时间:2014-09-23 15:36:49

标签: 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;
}

但我不知道如何获得田地的价值。

2 个答案:

答案 0 :(得分:2)

您可以使用superClass来获取superClass。 “对象”将是所有类的超类。 Object的SuperClass为null。要么检查“对象”,要么为空终止条件。无论如何,DeclaFields for Object都不会返回任何内容。

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;
}

答案 1 :(得分:0)

此代码不适用于深层克隆。 可以考虑开始这个:

private Object copy(Object entity) throws IllegalAccessException, InstantiationException {
    Class<?> clazz = entity.getClass();
    LOG.debug("Clazz="+clazz);
    Object newEntity = clazz.newInstance();

    while (clazz != null) {
        copyFields(entity, newEntity, clazz);
        clazz = clazz.getSuperclass();
    }
    return newEntity;
}
private void copyFields(Object entity, Object newEntity, Class<?> clazz) throws IllegalAccessException, InstantiationException {
    List<Field> fields = new ArrayList<>();
    for (Field field : clazz.getDeclaredFields()) {
        fields.add(field);
    }
    for (Field field : fields) {
        field.setAccessible(true);
        LOG.debug("Field name="+field.getName());
        LOG.debug("Field type="+field.getType());
        if (!field.getType().isPrimitive()) {
            entity = copy(field.getType().newInstance());
        } else field.set(newEntity, field.get(entity));
    }
}