Based on reflection, if you make fields public the below code work, if you want to make them private instead of setting field you can convert it by constructor.
public class CreateCustomerRequest {
public String fName;
public String lName;
public String gender;
public String address1;
public String address2;
public String mobileNo;
}
public static void main(String[] args) throws Throwable {
List<String> param = new ArrayList<String>();
param.add("fnameValue");
param.add("lNameValue");
param.add("genderValue");
param.add("address1Value");
param.add("address2Value");
param.add("mobileNoValue");
CreateCustomerRequest object = convert(param, CreateCustomerRequest.class);
System.out.println("Gender : " + object.gender);
}
public static <T extends Object> T convert(List<String> param, Class<T> clazz) throws Throwable
{
Constructor<?> ctor = clazz.getConstructor();
T result = (T) ctor.newInstance();
Field[] fields = result.getClass().getFields();
if(fields == null)
return null;
for(int i =0;i<fields.length;i++)
{
if(fields[i].getType().equals(String.class))
{
if(param.size() > i)
fields[i].set(result, param.get(i));
}
}
return result;
}
Cheers.
EDIT
For making DTO class fields private and read them via getter method, I edited my answer to support it.
Changes :
- Convert result.getClass().getFields() ---> result.getClass().getDeclaredFields() to able read privatye fields.
- calling fields[i].setAccessible(true) before setting value to field.
- Read field value via getter --> System.out.println("Gender : " + object.getGender());
so new code of DTO class is :
public class CreateCustomerRequest {
private String fName;
private String lName;
private String gender;
private String address1;
private String address2;
private String mobileNo;
public String getfName() {
return fName;
}
public void setfName(String fName) {
this.fName = fName;
}
public String getlName() {
return lName;
}
public void setlName(String lName) {
this.lName = lName;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAddress1() {
return address1;
}
public void setAddress1(String address1) {
this.address1 = address1;
}
public String getAddress2() {
return address2;
}
public void setAddress2(String address2) {
this.address2 = address2;
}
public String getMobileNo() {
return mobileNo;
}
public void setMobileNo(String mobileNo) {
this.mobileNo = mobileNo;
}
}
and converting code is :
public static void main(String[] args) throws Throwable {
List<String> param = new ArrayList<String>();
param.add("fnameValue");
param.add("lNameValue");
param.add("genderValue");
param.add("address1Value");
param.add("address2Value");
param.add("mobileNoValue");
CreateCustomerRequest object = convert(param, CreateCustomerRequest.class);
System.out.println("Gender : " + object.getGender());
}
public static <T extends Object> T convert(List<String> param, Class<T> clazz) throws Throwable
{
Constructor<?> ctor = clazz.getConstructor();
T result = (T) ctor.newInstance();
Field[] fields = result.getClass().getDeclaredFields();
if(fields == null)
return null;
for(int i =0;i<fields.length;i++)
{
if(fields[i].getType().equals(String.class))
{
if(param.size() > i)
{
fields[i].setAccessible(true);
fields[i].set(result, param.get(i));
}
}
}
return result;
}