代码之家  ›  专栏  ›  技术社区  ›  Josemy

如何为任何对象创建JobParameterBuilder?

  •  0
  • Josemy  · 技术社区  · 9 年前

    我试图创建一个方法,用对象的每个成员生成JobParameters对象。这是我目前得到的:

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

    2 回复  |  直到 9 年前
        1
  •  1
  •   Erich Schreiner    9 年前

    根据 https://docs.oracle.com/javase/tutorial/reflect/member/fieldTypes.html ,您可以使用 field.getType() 确定数据类型。

    Long long (原语)如下所示: Check type of primitive field

        2
  •  0
  •   Josemy    9 年前

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