使用反射从String CSV数据中动态创建不同的对象,特别是通用数组,这些数组的元素以String的形式出现,并以各种类型的数组的形式出现。
数据以String
的形式出现。我有一个称为stringToType
的方法。它将String
转换为其他类型的Object
。我为数组指定的格式是“ [element1_element2_element3]”,其中“元素”可以是任何类型。该String
类型为ArrayList<Object>
的事实是通过使用该数据的Class的批注逻辑获得的。例如,我的SalesRep
类接受了ArrayList<Object>
。此类需要采用stringToType
方法的返回值。
//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无法回答该问题的先前版本,因此我正在对其进行大量编辑。经过数天的研究,我仍然想不出一种自己做这件事的好方法,老实说,我不知道该怎么做。
我曾经想过只是尝试将每个元素转换为每种可能的类型,但是我找不到一种无需库和东西就能遍历所有可能类型的好方法。
我想避免使用图书馆和其他东西,因为
除了上述问题外,这种解决方案还很复杂。 O(m * n),泛型Array中有m个元素,n个类型。我想要的是一种使用时间更简单的方法来执行此操作,该方法使用我的原始数据并且不需要外部扩展。如果这根本不可能,那么上述标准将按重要性顺序排列,其中1绝对不可协商,3完全可协商。
如果提供有关如何轻松获取需要转换为的所有类型的列表的说明,我愿意尝试“尝试每种类型”的解决方案。仅当它尝试满足数字1和2的要求时,这才是正确的。不尝试问变色龙问题,只是探索我的选择。如果我所要求的不可能,那么我知道这一点很重要。