【问题标题】:Java Reflection: Casting an Object to another without knowing their typesJava 反射:在不知道对象类型的情况下将对象转换为另一个对象
【发布时间】:2014-06-30 13:11:30
【问题描述】:

我正在使用反射将 ResultSet 映射到 bean 中的 Field

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

问题是resultSetObjectInteger 类型,fieldType 是 Long,我无法将 Intger 转换为 Long 并获得 ClassCastException

【问题讨论】:

  • 在那个问题中,您明确知道您必须将 Integer 转换为 Long,但在这里我不知道它们的类型
  • 强制转换对对象的类型没有任何作用。
  • @SotiriosDelimanolis 你能详细说明一下吗?
  • 为什么是Integer类型的ResultSet派生对象,而目标字段是Long类型? (注意,我怀疑它实际上是相反的。)这里的 real 解决方案是确保您的 Java 和 SQL 数据模型匹配。

标签: java reflection casting resultset


【解决方案1】:

您实际上是在要求复制编译时可用的类型知识,编译器使用这些知识生成正确的转换。运行时没有这方面的知识,因此您必须通过构建类型矩阵并显式地编码您想要的所有转换来提供它。

您可以将其定义为沿两个轴(from-type 和 to-type)按类型索引的矩阵,或者更可能定义为键为 ConversionType 对象的 Map,每个实例定义 fromType、@987654323 @ 和 convert() 方法。

【讨论】:

    【解决方案2】:

    你有没有

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

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

    引用的对象将是String 类型。正在做

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

    不会改变被引用对象是String。在您的情况下,您可能需要一种转换策略来在类型之间进行转换。

    【讨论】:

    • 这很有趣,但能否请您分享您的来源以便我了解更多信息?谢谢
    • @kick 我现在没有。您必须区分实例、引用和变量。
    【解决方案3】:

    你还有一个选择,把long转成string,再转成integer。

    【讨论】:

    • 但是由于我不明确知道它们的类型,所以我必须为 fieldType 和 resultSetObject 可以是不同类型的情况做好准备,例如 Date、int、Double Boolean 或任何其他类型
    • 您不知道数据库中的确切数据类型?您可以从数据库 MetaData 中读取它。
    • 我可以做到,但我必须定义从每种可能的类型到其他所有类型的转换策略
    • 不,你只需要用字符串定义你的类型之间的转换规则。
    • 但是为什么呢?我不需要再把字符串转换成 myType 吗?
    猜你喜欢
    • 2016-08-08
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 2013-09-18
    • 1970-01-01
    相关资源
    最近更新 更多