Java反射:在不知道对象类型的情况下将对象强制转换为另一个对象

Java反射:在不知道对象类型的情况下将对象强制转换为另一个对象,java,reflection,casting,resultset,Java,Reflection,Casting,Resultset,我使用反射将结果集映射到bean中的字段 field = clazz.getDeclaredField(str); field.setAccessible(true); Object resultSetObject = rs.getObject(str); Class fieldType = field.getType(); field.set(clazzInst, fieldType.cast(resultSetObject)); 问题是resultSetObject的类型为Integer,

我使用反射将
结果集
映射到bean中的
字段

field = clazz.getDeclaredField(str);
field.setAccessible(true);
Object resultSetObject = rs.getObject(str);
Class fieldType = field.getType();
field.set(clazzInst, fieldType.cast(resultSetObject));

问题是
resultSetObject
的类型为
Integer
fieldType
的类型为Long,我不能将Intger转换为Long,而获取
ClassCastException
您实际上是在要求复制编译时可用的类型知识,编译器使用这些知识生成正确的转换。运行时没有这方面的知识,因此您必须通过构建类型矩阵并显式编码所有需要的转换来提供这方面的知识

您可以将其定义为沿两个轴(从类型和到类型)按类型索引的矩阵,或者更可能定义为键为
ConversionType
对象的映射,其每个实例定义
fromType
toType
convert()
方法。

<

Object ref = new String("object of type string");

引用的对象将是
字符串类型
。做

Object obj = (Object) new String("still a string");

不会更改引用的对象是
字符串
。在您的情况下,您可能需要一个转换策略来在类型之间进行转换。

您还有另一个选项,将long转换为string,然后转换为integer。

这个问题可能会帮助您解决这个问题,您清楚地知道必须将integer转换为long,但在这里我不知道他们的类型设置对对象的类型没有任何影响。@SotiriosDelimanolis您能详细说明一下吗?为什么ResultSet派生对象的类型是Integer,而目标字段的类型是Long?(注意,我怀疑实际情况正好相反。)这里真正的解决方案是确保Java和SQL数据模型匹配。但由于我不清楚它们的类型,我必须为fieldType和ResultsToObject可以是不同类型(如Date、int、,Double Boolean或任何其他类型您不知道数据库中的确切数据类型?您可以从数据库元数据中读取它。我可以这样做,但是我必须定义从每种可能的类型到每种其他类型的转换策略。不,您只需要定义类型与字符串之间的转换规则。但是为什么?难道我不需要再次将字符串转换为myType吗?这很有趣,但您能否分享您的源代码,以便我可以了解更多信息?感谢you@kick我现在没有。您必须区分实例、引用和变量。
Object obj = (Object) new String("still a string");