import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

class CarFiller {

	public static void main(String[] args) throws Exception {
		Map<String, String> data = new HashMap<>();
		data.put("name", "BMW");
		data.put("year", "2018");
		data.put("type", "TWO");

		Car car = new Car();
		fillField(car, "name", data);
		fillField(car, "year", data);
		fillField(car, "type", data);
		
		System.out.println(car);
	}
	
	private static void fillField(Object instance, String fieldName, Map<String, String> data) throws Exception {
		Field field = instance.getClass().getDeclaredField(fieldName);
		field.setAccessible(true);
		
		String value = data.get(fieldName);
		Object typedValue = null;
		final Class<?> type = field.getType();
		if (int.class.isAssignableFrom(type)) {
			typedValue = Integer.parseInt(value);
		} else if (type.isEnum()) {
			typedValue = Enum.valueOf((Class<Enum>) type, value);
		} else {
			// Assume String
			typedValue = value;
		}

		field.set(instance, typedValue);
	}
	
	enum  Type {
	    ONE, TWO
	}

	static class Car {
		private String name;
	    private int year;
	    private Type type;
    
		public void setName(String name) {
			this.name = name;
		}
		public void setYear(int year) {
			this.year = year;
		}
		public void setType(Type type) {
			this.type = type;
		}
		
	    @Override
		public String toString() {
			return "Car [name=" + name + ", year=" + year + ", type=" + type + "]";
		}		
	}
}
