【问题标题】:Get Thrift Field Type from ID从 ID 获取 Thrift 字段类型
【发布时间】:2014-07-24 05:44:03
【问题描述】:

有没有办法使用 thrift ID 获取参数的类型?我有数据需要转到 6 个不同的 Thrift 对象之一,所以我使用反射来实例化适当的对象并设置数据字段。

Class<?> cls = Class.forName(package + table.name);
Object o = cls.newInstance();
Method getField = cls.getMethod("fieldForId", int.class);
Object field = getField.invoke(o, thriftId);
Method setField = cls.getMethod("setFieldValue", field.getClass(), Object.class);
setField.invoke(o, field, data);

变量data 是一个字符串。这段代码运行良好,直到遇到一个类型不是 String 的字段,我可以在其中获得 ClassCastException。我试过这样做:

Method getFieldValue = cls.getMethod("getFieldValue", field.getClass());
System.out.println(getFieldValue.invoke(o, field).getClass.getName());

但是对于String,getFieldValue如果为空则返回null,无法获取类。我可以假设所有空值都是字符串,但考虑到列表、地图等也可能返回为空,这似乎很危险。

我也尝试获取该字段的类,但它只是以 Enum (_Fields) 的形式返回,这是预期的。

【问题讨论】:

  • 由于给定字段的类型应该是固定的,那么您自己建立一个简单的基于字段ID的映射表呢?
  • 最终我将拥有多达 150 个对象类型,每个对象类型都有 30 多个字段。我宁愿不写所有这些映射。获取对象的类型很好,发现对象中每个字段的类型给我带来了麻烦。
  • 如何为这些对象填写data?全靠反思?
  • 我有一个数组(从分隔文件中读取),例如,数组索引对应于节俭字段 1。所以我得到了 ID 1 的字段并将其设置为字段 [0] 中包含的内容。反射只会发挥作用,因为直到运行时我才知道需要哪个 thrift 对象。

标签: java thrift


【解决方案1】:

我设法找到了解决方案。获取字段的名称,然后获取该字段。

Method getFieldName = field.getClass().getMethod("getFieldName");
String fieldName = (String) getFieldName.invoke(field);
Class<?> fieldType = cls.getField(fieldName).getType());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 2020-11-27
    • 2014-12-17
    • 2021-10-29
    • 1970-01-01
    相关资源
    最近更新 更多