2011-10-06 5 views
5
public class MyClass{ 
    public String elem1; 
    public int elem2; 
    public MyType elem3; 
................. 
} 

MyClass object1=new MyClass(); 
MyClass object2=new MyClass(); 
object1.elem1=... 
object1.elem2=... 
... 
object2.elem1=... 
object2.elem2=null 
..... 

내가 원하는 것은 동적으로 모든 구성원에이 MyClass의 모든 멤버를 통과하고 실행병합하는 방법 자바

object1.merge(object2); 

같은 것이

if(object1.elem != object2.elem && object2.elem!=null) 
object1.elem=object2.elem; 

같은입니다 동적 객체 메커니즘이 Java에 존재합니까?

답변

8

반사를 사용하십시오. 클래스 필드로 이동하십시오. 가설 :

Field[] fields = aClass.getFields(); 
for (Field field : fields) { 
    // get value 
    Object value = field.get(objectInstance); 
    // check the values are different, then update 
    field.set(objetInstance, value);  
} 

그리고 일치하는 값. 값이 다르면 값을 업데이트하십시오.

1

리플렉션 (Class.getFields()으로 시작)을 사용하여 직접 이러한 메서드를 작성할 수 있지만 표준 API에는이 작업을 수행하는 도구가 없습니다.

0

아무 것도 내장되어 있지 않지만, Dozer을보고 싶을 수도 있습니다. 어쩌면 약간의 조정으로이 작업을 수행 할 수 있습니다.

리플렉션 (Dozer의 기능)을 사용하여이를 수행 할 수도 있습니다.

2

반사가지도에서 필드를 저장하는 것보다 더 효율적입니다있는 옵션이 병합 더 효율적으로 만들 것입니다하지만 일반 필드 액세스 효율성이 떨어질 것

Map<String, Object> fields; 

void merge(MyClass other){ 
    for (String fieldName : fields.keys()){ 
     Object thisValue = this.fields.get(key); 
     Object otherValue = other.fields.get(key); 
     if (thisValue != otherValue && otherValue != null){ 

       this.fields.put(fieldName, otherValue); 
     } 
    } 
} 

.

관련 문제