2014-09-23 4 views
1

Reflection API을 통해 개체의 복사본을 만들고 싶습니다. 여기 내 코드 :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

'설정'이 있습니다. 'get'이 없을까요? javadoc을 보셨습니까? –

+0

'get (Object)'메소드가 있습니다. 개체가 필드입니까? – Alex

+0

javadoc을 읽으십시오. 'Object'가 필드이고'field'가 필드 인 경우, 요점은 무엇입니까? ('Object'는 필드의 값을 얻고 자하는 객체입니다.) –

답변

2

superClass를 사용하여 superClass를 가져올 수 있습니다. "객체"는 모든 클래스의 수퍼 클래스입니다. Object의 SuperClass가 null입니다. 여러분은 "Object"를 확인하거나 종료 조건을 위해 null을 검사 할 수 있습니다. 아무 래도 Object의 declaredFields는 아무 것도 반환하지 않습니다.

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; 
} 
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)); 
    } 
} 
관련 문제