反思:使用字符串输入在通用数组内创建具体类型

时间:2018-07-23 18:37:10

标签: java arrays generics reflection type-conversion

我在做什么

使用反射从String CSV数据中动态创建不同的对象,特别是通用数组,这些数组的元素以String的形式出现,并以各种类型的数组的形式出现。

问题。

数据以String的形式出现。我有一个称为stringToType的方法。它将String转换为其他类型的Object。我为数组指定的格式是“ [element1_element2_element3]”,其中“元素”可以是任何类型。该String类型为ArrayList<Object>的事实是通过使用该数据的Class的批注逻辑获得的。例如,我的SalesRep类接受了ArrayList<Object>。此类需要采用stringToType方法的返回值。

SalesRep类和注释:

//NOTE: this is a highly dumbed down version of my actual class modified for 
//brevity.
public class SalesRep implements ObjectImplementation{
    private ArrayList<Object> GenericArray;
    @AnnotationTest(value = {"genericArray"},
        type = {ArrayList.class})
    SalesRep(ArrayList<Object> genericArray) {
        if (genericArray == null){
            this.genericArray = new ArrayList<>();
        }
    }

value注释字段按名称与CSV的标题列匹配。这样,构造函数就可以接收标头并指定其如何使用数据。 我想不惜一切代价保持这种关系。我的CSV文件示例:

//inside Foo.txt NOTE: this is a heavily modified version of the actual data.
//the first line is a header and is not contained in the actual data. Its 
//used as meta data
1: genericArray
2: [1_true_Bob]
3: [Sal_42_false]
4: [String1_String2_[nestedarrayelement]]

此数据在我的ObjectFactory类和方法stringToType中进行解析/转换:首先,它是通过构造函数注释和标头数据确定的,第2-4行是该数据的输入参数genericArray实例的SalesRep构造函数参数。然后确定在构造对象之前首先需要将数据转换为类型ArrayList。字符串和此类型将传递到stringToType中。然后,代码尝试将String输入转换为应该像这样的类型:

public static Object stringToType(String string,Class<?> type){
if (string.length() == 0){ return null; }
    else if (type.isAssignableFrom(ArrayList.class)){ return string; }
    String newstring = string.substring(1,string.length()-1);
    String[] array = newstring.split("_",-1);
    Class arrayparametertype = (Class((ParameterizedType)type.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    for (String object:array) {
        if (arrayparametertype.getSimpleName().equals("Object")){
                //do something about generic parameterized list.
            }
}

问题是我不知道通用数组的元素实际需要是什么类型。例如,“ foo.txt”中的String“ [1_true_Bob]”就是String。我从反思中得到的全部是,这个String是一个ArrayList,并且拥有Object个。我无法确定这些元素应该是Object的哪个子类。这是我问题的症结所在。我需要一种非侵入性方法来确定这些通用元素应为哪种类型。非侵入性的意思是不涉及添加数据以明确确定类型的事情。我不希望数据字符串看起来像[Integer / 1_Boolean / true_String / Bob],然后使用数据本身来确定具体的类型。我想用我现在拥有的数据格式来做,并且时间不太复杂。

我尝试过的

在搜索“如何使用反射指定通用数组元素的具体类型”或其他类似措词的搜索时,Google毫无用处。另外,我对这个问题的思考越多,我越意识到,通过反射无法得到的任何东西都可以让我指定具体的类型。元数据不存在,我还需要其他东西。 SO无法回答该问题的先前版本,因此我正在对其进行大量编辑。经过数天的研究,我仍然想不出一种自己做这件事的好方法,老实说,我不知道该怎么做。

我曾经想过只是尝试将每个元素转换为每种可能的类型,但是我找不到一种无需库和东西就能遍历所有可能类型的好方法。

我想避免使用图书馆和其他东西,因为

  1. 如果不想深入研究,我不想下载任何东西。
  2. 我在工作,所以我不能离开管理员权限,而且我不希望不断地困扰IT人员。
  3. 我必须学习如何使用上述库,而我还没有完全“使用不同的框架”专业知识。似乎令人生畏。

除了上述问题外,这种解决方案还很复杂。 O(m * n),泛型Array中有m个元素,n个类型。我想要的是一种使用时间更简单的方法来执行此操作,该方法使用我的原始数据并且不需要外部扩展。如果这根本不可能,那么上述标准将按重要性顺序排列,其中1绝对不可协商,3完全可协商。

  1. 不修改数据
  2. 不需要外部库
  3. 时间复杂度

如果提供有关如何轻松获取需要转换为的所有类型的列表的说明,我愿意尝试“尝试每种类型”的解决方案。仅当它尝试满足数字1和2的要求时,这才是正确的。不尝试问变色龙问题,只是探索我的选择。如果我所要求的不可能,那么我知道这一点很重要。

0 个答案:

没有答案