gpt4 book ai didi

使用 jdbc 时泛型类型的 java 反射

转载 作者:行者123 更新时间:2023-12-01 16:42:18 26 4
gpt4 key购买 nike

在 C# 中,我得到了一个实用程序,可以将 Datatable 转换为指定模型的列表,如下所示:

Datatable dt = conn.GetDataTable(); 
List<BookModel> result = EntityHelper<BookModel>.GetListModel(dataTable);

使用泛型类型的 GetListModel() 方法如下所示:

public static List<T> GetListModel(DataTable dt)
{
List<T> lObject= new List<T>();
for (int i = 0; i < dt.Rows.Count; i++)
{
T obj = new T();
for (int j = 0; j < dt.Columns.Count; j++)
{
int index = IndexOfField( dt.Columns[j].ColumnName );
if (index != -1)
{
PropertyInfo pi = obj.GetType().GetProperties()[index];
Type propType = pi.PropertyType;
if (propType.IsGenericType && (propType.GetGenericTypeDefinition() == typeof( Nullable<> )))
{
propType = propType.GetGenericArguments()[0];
}
if (propType.IsEnum)
{
int objectValue = 0;
Int32.TryParse( dt.Rows[i][j].ToString(), out objectValue );
pi.SetValue( obj, Enum.ToObject( propType, objectValue ), null );
}
else if (dt.Columns[j].DataType == propType && dt.Rows[i][j] != DBNull.Value)
{
pi.SetValue( obj, dt.Rows[i][j], null );
}
else if ((propType.Name.Equals( "Boolean" ) || propType.Name.Equals( "bool" )) && dt.Rows[i][j] != DBNull.Value)
{
pi.SetValue( obj, Convert.ToBoolean( dt.Rows[i][j] ), null );
}
}
}

lObject.Add( obj );
}
return lObject;
}

这是 C# 的故事,现在回到 Java。我正在使用 JDBC 执行存储过程并返回 ResultSet。但我发现在 Java 中,泛型类型的信息在运行时被删除,所以我不能做这样的事情:

public static <T> List<T> castObject(ResultSet rs)
{
T x = new T(); //IMPOSSIBLE ;___;
Field[] fields = x.getClass().getDeclaredFields();
for(Field field: fields)
{
field.setAccessible(true);
}
....
}

如果不可能创建这样的实用程序,那么在获取结果集后是否可以减少样板代码?我的表有大约 30 列,我不想处理这样的代码:

actor.setFirstName(rs.getString("first_name"));
actor.setLastName(rs.getString("last_name"));
...

最佳答案

您可以通过将 Class 实例作为参数传递给您的方法来实例化该类。如何执行此操作取决于您使用的 Java 版本,但这里是 Java 9 及更高版本的示例(尽管早期版本类似):

public static <T> List<T> castObject(ResultSet rs, Class<T> clazz) throws NoSuchMethodException,
IllegalAccessException, InvocationTargetException, InstantiationException {

Constructor<T> constructor = clazz.getConstructor();
T t = constructor.newInstance();
...
}

调用方法:

List<BookModel> bookModels = castObject(rs, BookModel.class);

但是调用 setAccessible 可能会出现问题。此讨论显示了一种解决方法。 How to solve InaccessibleObjectException ("Unable to make {member} accessible: module {A} does not 'opens {package}' to {B}") on Java 9?

关于使用 jdbc 时泛型类型的 java 反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61839179/

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