import java.util.*;
import java.lang.*;
import java.lang.reflect.*;

class Main
{

	public static void main (String[] args) throws java.lang.Exception
	{
	    Source source = new Source();
        Destination destination = new Destination();
  
  
        Class sourceClassObject = source.getClass();
        Class destClassObject = destination.getClass();
        Field[] sourceFields = sourceClassObject.getDeclaredFields();
        Field[] destFields = destClassObject.getDeclaredFields();
        
        for (Field fieldSrc : sourceFields) {
            int mod = fieldSrc.getModifiers();  // get modifiers
            System.out.print("Source Field: " + Modifier.toString(mod) + " "
              + fieldSrc.getType() + " " + fieldSrc.getName());
            fieldSrc.setAccessible(true);
            System.out.println(" [" + fieldSrc.get(source) + "]");
            for (Field fieldDest : destFields){
                if (fieldDest.getType().equals(fieldSrc.getType()) && 
                    fieldDest.getName().equals(fieldSrc.getName())){
                    fieldDest.setAccessible(true);
                    fieldDest.set(destination, fieldSrc.get(source));
                }                
            }
        }
        
        destination.printValues();
    }
    
    static class Source{        
        
        public Source(){
            strField = "This is a String";
            intField = 42;
            dateField = new Date();
        }
        
        private String  strField;
        private Integer intField;
        private Date    dateField;
    }
    
    static class Destination{        
        private String  strField;
        private Integer intField;
        private Date    dateField;
        
        public void printValues(){
            System.out.println("Destination Field values: ");
            System.out.println("strField: " + strField);
            System.out.println("intField: " + intField);
            System.out.println("dateField: " + dateField);
        }
    }    
}