2017-06-30 44 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"); 
    } 

}