JAVA:将String转换为(动态已知的)基本类型,以便实例化(动态已知的)类
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了JAVA:将String转换为(动态已知的)基本类型,以便实例化(动态已知的)类,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2453字,纯文字阅读大概需要4分钟。
内容图文
![JAVA:将String转换为(动态已知的)基本类型,以便实例化(动态已知的)类](/upload/InfoBanner/zyjiaocheng/780/b0d955fbe50d400fa2a0c270b1b1d529.jpg)
我有一个使用文本文件(一个要求)的存储库类,这意味着我必须读取字符串并转换它们才能实例化对象.问题是我希望我的存储库类可以像我一样使用它,以便使用它来操作不同的对象类型.
那么,是否有一种(更优雅的)方法可以将字符串动态地转换为运行时所需的任何字段(基本)类型,同时避免大量的
try-catch结构有多个ifs / switch?
作为一个简短的简化版本,我希望objectA.txt只包含objectA的信息,类似于objectB.txt和我的Repository代码来处理两者:
存储库repoA =新存储库(“objectA.txt”,< A的类型列表>); TypeA a = repoA.getOne();
存储库repoB =新存储库(“objectB.txt”,< B的类型列表>); TypeB b = repoB.getOne();
是)我有的:
public class FileRepository extends InMemoryRepository{
private String fileName;
private List<Class> types;
public FileRepository(String fileName, List<Class> types) {
//@param types
// - list containing the Class to be instantiated followed by it's field types
super();
this.fileName = fileName;
this.types=types;
loadData();
}
private void loadData() {
Path path = Paths.get(fileName);
try {
Files.lines(path).forEach(line -> {
List<String> items = Arrays.asList(line.split(","));
//create Class array for calling the correct constructor
Class[] cls=new Class[types.size()-1];
for (int i=1; i<types.size(); i++){
cls[i-1]=types.get(i);
}
Constructor constr=null;
try {
//get the needed constructor
constr = types.get(0).getConstructor(cls);
} catch (NoSuchMethodException e) {
//do something
e.printStackTrace();
}
//here is where the fun begins
//@arg0 ... @argn are the primitives that need to be casted from string
//something like:
//*(type.get(1))* arg0=*(cast to types.get(1))* items.get(0);
//*(type.get(2))* arg1=*(cast to types.get(2))* items.get(1);
//...
Object obj= (Object) constr.newInstance(@arg0 ... @argn);
});
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
P.S.:我是JAVA的新手,所以请尽量简化解释.
解决方法:
没有IDE,所以我希望这是有道理的:
private static final Map<Class, Function<String, ?>> parsers = new HashMap<>();
static {
parsers.put(Long.class, Long::parseLong);
parsers.put(Integer.class, Integer::parseInt);
parsers.put(String.class, String::toString);
parsers.put(Double.class, Double::parseDouble);
parsers.put(Float.class, Float::parseFloat);
// add your own types here.
}
public <T> T parse(Class<T> klass, String value) {
// add some null-handling logic here? and empty values.
return (T)parsers.get(klass).apply(value);
}
然后,当您需要为构造函数创建参数时:
parameters =
IntStream
.range(0, cls.size-1)
.map(i -> (Object)parse(types.get(i), items.get(i)))
.toArray(Object[]::new);
内容总结
以上是互联网集市为您收集整理的JAVA:将String转换为(动态已知的)基本类型,以便实例化(动态已知的)类全部内容,希望文章能够帮你解决JAVA:将String转换为(动态已知的)基本类型,以便实例化(动态已知的)类所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。