2017-06-30 2 views
0

Ich versuche, eine Methode zu erstellen, die ein JobParameters-Objekt mit jedem einzelnen Mitglied eines Objekts generiert. Das ist, was ich bis jetzt bekommen habe:Wie erstellt man einen JobParameterBuilder für ein beliebiges Objekt?

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(); 
} 

Aber das funktioniert nur, wenn das Objekt kein Element hat, das sich von Long unterscheidet. Wie könnte ich das generalisieren, um mit allen primitiven Typen zu arbeiten?

Antwort

0

Dank der von Eric ich zu einer Lösung erhalten gegeben Spitze, die mit mehr „Komplex“ Objekten arbeiten können:

Ein Beispiel für Felder vom Typ Long oder long (primitive) ist hier gegeben

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"); 
    } 

} 
Verwandte Themen