Java 将字符串转换为对象的通用方法
我正在实现一个实用方法,该方法接受字符串作为参数,并使用泛型转换为对象。我可以用下面的代码实现,但是的弱点是需要解析的每个对象都必须有一个字符串构造函数。无法定义对象必须具有字符串构造函数。有没有其他更好的方法通过使用多态性或泛型来实现这一点 AAA.javaJava 将字符串转换为对象的通用方法,java,generics,polymorphism,Java,Generics,Polymorphism,我正在实现一个实用方法,该方法接受字符串作为参数,并使用泛型转换为对象。我可以用下面的代码实现,但是的弱点是需要解析的每个对象都必须有一个字符串构造函数。无法定义对象必须具有字符串构造函数。有没有其他更好的方法通过使用多态性或泛型来实现这一点 AAA.java public class AAA { private String id; private String description; public AAA(String str) { // Do p
public class AAA {
private String id;
private String description;
public AAA(String str) {
// Do parsing...
}
实用方法。
public static <T extends Base> List<T> readFile(File file, Class<T> type) {
List<T> collection = new ArrayList<T>();
// Read file line by line and convert to Instance
Constructor<T> ctor = type.getConstructor(String.class);
T newInstance = ctor.newInstance(line);
if (newInstance != null) {
collection.add(newInstance);
}
return collection;
}
公共静态列表readFile(文件文件,类类型){
列表集合=新的ArrayList();
//逐行读取文件并转换为实例
Constructor=type.getConstructor(String.class);
T newInstance=ctor.newInstance(行);
if(newInstance!=null){
collection.add(newInstance);
}
回收;
}
用法:
List<AAA> list = FileUtil.readFile(file, AAA.class);
List List=FileUtil.readFile(文件,AAA.class);
我假设您的POJO类(实际包含数据的类)通常采用示例中的格式。这意味着所有字段都是String
值。如果不是这样,我的解决方案需要一点改进
我的建议是对您描述的用例使用反射。我过去在这方面非常成功。尽管如果应用不当,反射可能会造成严重的性能损失
解析代码大致如下所示。我省略了一个方法头,因为您提供的方法头看起来已经很好了。我提供的代码将假定在字符串[]
变量行
中,我们找到了CSV文件的已解析行。包含CSV行一列的数组的每个元素
String[] line; // initialised as explained above
T newInstance = T.newInstance(); // invoke default constructor
Field[] fields = newInstance.getClass().getDeclaredFields(); // use reflection to read all fields
int count = 0;
for(Fields f : fields) {
f.set(newInstance, line[count]);
count++;
}
免责声明:以上代码不做任何边界检查!假设CSV行和类中的字段数具有相同的长度
在字段
对象上,我通常还调用getAnnotation
来检查字段上是否设置了某个注释。这允许您编写如下类:
public class AAAAnnotated {
@MyCSVAnnotation
String field1;
@MyCSVAnnotation
String field2;
String field3;
}
如果您的代码检查字段是否使用注释进行注释,您甚至可以在POJO类中控制哪些字段以CSV形式加载,哪些字段保持不变。字符串的格式是什么?或者更确切地说是你的档案。它是CSV逗号分隔的还是JSON或类似的格式。是你决定字符串的格式吗?@DanielvanHeerden它是CSV@swemon如果我理解得好,您希望编译器强制执行
readFile
方法的Class type
参数有一个构造函数,该构造函数接受字符串作为其唯一参数,对吗?