I found the reflection approach the cleanest -- I added a twist to this solution since most production classes have nested classes and I didn't see any examples that demonstrates this (but I didn't look for very long either). My reason for using reflection is that my "updateUser()" method below had a bunch of redundant code and just one line that changed (for every field in the user object) in the middle that updated the user object:
NameDTO.java
public class NameDTO {
    String first, last;
    public String getFirst() {
        return first;
    }
    public void setFirst(String first) {
        this.first = first;
    }
    public String getLast() {
        return last;
    }
    public void setLast(String last) {
        this.last = last;
    }   
}
UserDTO.java
public class UserDTO {
    private NameDTO name;
    private Boolean honest;
    public UserDTO() {
        name = new NameDTO();
        honest = new Boolean(false);
    }
    public NameDTO getName() {
        return name;
    }
    public void setName(NameDTO name) {
        this.name = name;
    }
    public Boolean getHonest() {
        return honest;
    }
    public void setHonest(Boolean honest) {
        this.honest = honest;
    }
}
Example.java
import java.lang.reflect.Method;
public class Example {
    public Example ()  {
        UserDTO dto = new UserDTO();
        try {
            Method m1 = dto.getClass().getMethod("getName", null);
            NameDTO nameDTO = (NameDTO) m1.invoke(dto, null);
            Method m2 = nameDTO.getClass().getMethod("setFirst", String.class);
            updateUser(m2, nameDTO, "Abe");
            m2 = nameDTO.getClass().getMethod("setLast", String.class);
            updateUser(m2, nameDTO, "Lincoln");
            m1 = dto.getClass().getMethod("setHonest", Boolean.class);
            updateUser(m1, dto, Boolean.TRUE);
            System.out.println (dto.getName().getFirst() + " " + dto.getName().getLast() + ": honest=" + dto.getHonest().toString());
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }
    public  void updateUser(Method m,  Object o, Object v) {
        //  lots of code here
        try {
            m.invoke(o, v);
        } catch (Exception e) {
            e.printStackTrace();
        } 
        // lots of code here -- including a retry loop to make sure the
        // record hadn't been written since my last read
    }
    public static void main(String[] args) {
        Example mp = new Example();
    }
}