您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在Java中是否可以检查对象字段是否为null,然后将默认值添加到所有这些属性?

在Java中是否可以检查对象字段是否为null,然后将默认值添加到所有这些属性?

您可以使用反射来遍历对象的字段并进行设置。您显然需要在类型甚至字段名称与所需的认值之间进行某种映射,但这可以很容易地在循环中完成。例如:

for (Field f : obj.getClass().getFields()) {
  f.setAccessible(true);
  if (f.get(obj) == null) {
     f.set(obj, getDefaultValueForType(f.getType()));
  }
}

使用现代Java,您可以使用注释为每个类设置字段的认值。完整的实现可能如下所示:

// DefaultString.java:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface DefaultString {
    String value();
}

// DefaultInteger.java:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

@Retention(RetentionPolicy.RUNTIME)
public @interface DefaultInteger {
    int value();
}

// DefaultPojo.java:
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;

public class DefaultPojo {

    public void setDefaults() {
        for (Field f : getClass().getFields()) {
            f.setAccessible(true);
            try {
                if (f.get(this) == null) {
                    f.set(this, getDefaultValueFromAnnotation(f.getAnnotations()));
                }
            } catch (illegalaccessexception e) { // shouldn't happen because I used setAccessible
            }
        }
    }

    private Object getDefaultValueFromAnnotation(Annotation[] annotations) {
        for (Annotation a : annotations) {
            if (a instanceof DefaultString)
                return ((DefaultString)a).value();
            if (a instanceof DefaultInteger)
                return ((DefaultInteger)a).value();
        }
        return null;
    }

}

// Test Pojo
public class TestPojo extends DefaultPojo {
    @DefaultString("Hello World!")
    public String stringValue;
    @DefaultInteger(42);
    public int integerValue;
}

然后TestPojo只需运行即可设置a的认值test.setDetaults()

java 2022/1/1 18:14:13 有423人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶