gpt4 book ai didi

java - 如何将 Field(Reflection) 的值设置为 POJO?

转载 作者:行者123 更新时间:2023-12-02 10:40:14 25 4
gpt4 key购买 nike

我正在致力于将值从 ResultSet 动态映射到 java 中的 POJO。我能够获取这些值,但不知道如何将这些值设置为 pojo。有什么建议么?提前致谢!!

List<T> results = new ArrayList<>();
while(resultSet.next())
{
T newObj = clazz.newInstance();
for (Field field : clazz.getDeclaredFields())
{
String fieldName = field.getName().toLowerCase();
if (columnNames.containsKey(fieldName))
{
final int index = columnNames.get(fieldName);
field.set(fieldName, resultSet.getObject(index+1));
}
}
results.add(newObj);
}

最佳答案

Field.set 的第一个参数必须是对象(如果它是实例字段),或者 null(对于 static 字段)。您正在传递 fieldName,这显然是错误的。

所以改变

field.set(fieldName, resultSet.getObject(index+1));

field.set(newObj, resultSet.getObject(index+1));

当您的代码没有必要的访问权限时,可能需要在 Field 对象上设置“可访问”状态。但一般来说,您应该避免对 ResultSet 的每一行重复如此昂贵的操作。所以,你可以使用

List<T> results = new ArrayList<>();
Field[] theFields = clazz.getDeclaredFields();
// if overriding access right is needed:
AccessibleObject.setAccessible(theFields, true);

while(resultSet.next())
{
T newObj = clazz.newInstance();
for (Field field: theFields)
{
Integer index = columnNames.get(field.getName().toLowerCase());
if(index != null)
field.set(newObj, resultSet.getObject(index+1));
}
results.add(newObj);
}

相反。甚至

List<T> results = new ArrayList<>();
Field[] theFields = clazz.getDeclaredFields();
// if overriding access right is needed:
AccessibleObject.setAccessible(theFields, true);

int numberOfFields = theFields.length;
int[] columnIndex = new int[numberOfFields];
for(int ix = 0; ix < numberOfFields; ix++) {
Integer index = columnNames.get(theFields[ix].getName().toLowerCase());
if(index != null) columnIndex[ix] = index + 1;
}

Constructor<T> con = clazz.getConstructor();

while(resultSet.next())
{
T newObj = con.newInstance();
for(int ix = 0; ix < numberOfFields; ix++)
if(columnIndex[ix] != 0)
theFields[ix].set(newObj, resultSet.getObject(columnIndex[ix]));
results.add(newObj);
}

这在初始化中更加复杂,但进一步减少了循环内的重复工作。请注意,此处使用 Constructor 不仅仅是一种优化,从 Java 9 开始,Class.newInstance() 已被标记为已弃用。 p>

关于java - 如何将 Field(Reflection) 的值设置为 POJO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52967886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com