我想通过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;
}
但我不知道如何获得田地的价值。
答案 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));
}
}