java 动态类型转换_JAVA:将String转换为(动态已知的)基本类型,以便实例化(动态已知的)类...

我有一个使用文本文件(一个要求)的存储库类,这意味着我必须读取字符串并转换它们才能实例化对象.问题是我希望我的存储库类可以像我一样使用它,以便使用它来操作不同的对象类型.

那么,是否有一种(更优雅的)方法可以将字符串动态地转换为运行时所需的任何字段(基本)类型,同时避免大量的

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 types;

public FileRepository(String fileName, List 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 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

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> 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 parse(Class 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,reflection

来源: https://codeday.me/bug/20190702/1355135.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值