0

I am trying to create a method that generates a JobParameters object with every single member of an object. This is what I got so far:

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

But this works only if the object doesn't have any member different from Long. How could I generify this to work with all primitive types?

Josemy
  • 810
  • 1
  • 12
  • 29

2 Answers2

1

According to https://docs.oracle.com/javase/tutorial/reflect/member/fieldTypes.html, you can use field.getType() to determine the data type.

An example for fields of type Long or long (primitive) is given here: Check type of primitive field

Erich Schreiner
  • 2,038
  • 1
  • 14
  • 24
0

Thanks to the tip given by Eric I get to a solution that can work with more "complex" objects:

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

}
Josemy
  • 810
  • 1
  • 12
  • 29