2017-06-30 39 views
0

我正在尝试创建一个方法来为每个对象的每个成员生成一个JobParameters对象。这是我到目前为止:如何为任何对象创建JobParameterBuilder?

public static JobParameters getAttributesAsJobParameters(Object objectToConvert) throws IllegalAccessException { 
    JobParametersBuilder jobParametersBuilder = new JobParametersBuilder(); 

    for (Field field : objectToConvert.getClass().getDeclaredFields()) { 
     field.setAccessible(true); 
     jobParametersBuilder.addLong(field.getName(), (Long) field.get(objectToConvert)); 
    } 

    return jobParametersBuilder.toJobParameters(); 
} 

但是,只有当对象没有任何成员不同于长。我怎样才能将这个基因变成与所有原始类型一起工作?

回答

0

由于通过Eric给出我得到一个解决方案,可以以更“复杂”对象的工作尖端:

public static JobParametersBuilder getAttributesAsJobParameters(Object objectToConvert) throws IllegalAccessException { 
    JobParametersBuilder jobParametersBuilder = new JobParametersBuilder().addLong("time", System.currentTimeMillis()); 

    for (Field field : objectToConvert.getClass().getDeclaredFields()) { 
     field.setAccessible(true); // We need this to access to attributes if they are private 
     if (!field.getType().isPrimitive()) { 
      jobParametersBuilder = getAttributesAsJobParameters(field.get(objectToConvert)); 
     } else { 
      matchJobParametersType(jobParametersBuilder, field, objectToConvert); 
     } 
    } 
    return jobParametersBuilder; 
} 

public static void matchJobParametersType(JobParametersBuilder jobParametersBuilder, Field fieldOfObject, Object object) throws IllegalAccessException { 
    String dataTypeOfField = fieldOfObject.getType().getSimpleName(); 

    switch (dataTypeOfField) { 
     case "long": 
      jobParametersBuilder.addLong(fieldOfObject.getName(), (Long) fieldOfObject.get(object)); 
      break; 
     case "String": 
      jobParametersBuilder.addString(fieldOfObject.getName(), (String) fieldOfObject.get(object)); 
      break; 
     default: 
      throw new JobParametersException("Data type " + dataTypeOfField + " not defined"); 
    } 

}