我有一些POJO,我有一个案例,我以不知情的方式收到有关他们领域的信息。我的意思是我收到每个实例的Map,包含模式[field_name:field_value]中的一些对,我想用地图中的信息初始化实例。 所以我所做的是用单一方法
创建一个Initializable接口 public void initialize (Map initMap) throws Exception
然后我为我的POJO创建了一个超类来实现这个接口方法。这样我就可以确保我需要的每个类都可以从Map初始化。
我不太确定我能想到的模式是正确的模式,我觉得可以有一个标准的Java解决方案来应对这种微不足道的问题。那么有谁知道是否有一种标准的方法来做到这一点?
感谢您的回答!
编辑(答案):经过以下主题的一些讨论后,向我解释说我打算做的不是一个标准的案例,我不希望有一个标准的解决方案。我可以同意。另外,正如你所说,实现它并没有那么多努力。 我作为Java输入接收的内容可以描述为JSONObject。此JSONObject中的信息将用于创建我的实现模型所包含的特定类的特定java实例。出于这个原因,我正在使用反思。我正在实例化的类用大量字段描述,而我需要创建的实例的信息只包含一些字段。所以我的方法是创建实例,并使用该实例字段信息的Map来初始化具有所需信息的对象。
结论:我的问题不是标准问题。我将自己实现和管理Initializable抽象。
非常感谢所有发表意见的人!!!
答案 0 :(得分:0)
如果Map
包含字段名称与字段值,则可以使用反射
public void initialize (Map<String, Object> initMap) throws Exception {
super.initialize(initMap);
for(Field f : getClass().getDeclaredFields()) {
Object value = initMap.get(f.getName());
f.setAccessible(true);
f.set(this, value);
}
}
这个方法可以放在任何Pojo中,你可以使所有Pojo扩展IPojo
interface IPojo {
public void initialize (Map<String, Object> initMap) throws Exception;
}
答案 1 :(得分:0)
您正在处理“字符串类型”数据(数据中的字符串必须与源中的某些名称匹配),但您可以使用反射来实现它:
public void initialize(Map<String, Object> initMap) throws Exception {
for (Map.Entry<String, Object> entry : initMap.entrySet())
getClass().getDeclaredField(entry.getKey()).set(this, entry.getValue());
}
注意:从拥有类中调用setAccessible(true)
时,无需致电set()
;私有字段始终可供类本身访问。