在Java反射中,将String转换为另一种类型作为方法的参数



我正试图通过Java中的反射将一个值传递给一个方法。

也就是说,假设我们有字符串

String value = (some string representation of a value of type Type);

比方说,我们有一个没有args构造函数的类,一个字段int field和一个方法,一个setter方法setTheField:

public class SomeClass{
private SomeType field;
SomeClass(){};
public void setTheField(SomeType parameter){
this.field = parameter
}
} 

其中fieldSomeType可以是基元、包装器或LocalDate/LocalDateTime

如果我拿二传手(说(:

Method setter = SomeClass.getClass().getDeclaredMethods()[0];

然后找出它的参数(比如(:

parametersList = Arrays.stream(setter.getParameters())
.collect(Collectors.toList());

然后,如果检查设置器是否需要单个参数:

if (parametersList.size() != 1) {
throw new IllegalArgumentException("Setter named = " +
setter.getName() +
" is not a single parameter setter!");
}

然后,我真正想做的是将string传递给某个对象SomeClass object = new SomeClass();上的"setter"作为setter.invoke(object, value);,我需要以某种方式将String value猫到SomeType,但我不知道如何统一地执行。

不过,这似乎是一种标准的情况,我希望Java中有比我更开明的人能很快想出该怎么办

欢迎提出任何建议。

附录:

我在这里详细介绍一些。我要做的任务如下。假设我有一个针对方法(或字段(的注释@Column{String name}。假设我还有一些域类SomeClass,其中一些setter(字段(注释为@Column。我必须从CSV顶行读取列名(将数据链接到注释名称的标题(,然后我必须返回域类SomeClass的对象列表。这就是我使用反射的原因,我看不到其他方法。

如果没有更多上下文,这看起来像是一个设计问题。为什么要通过反射获取一个setter,并给定一个String,获得一个与setter参数类型兼容的值?如果没有其他方法来解决这个问题,那么就不可能将String强制转换为其他类型。一种可能性是制作工厂级。

假设:setter的参数类型是一个名为MyType的类。

class ArgumentFactory {
MyType valueFor(String in) {
// based on the string's value, put the conversion logic here
if (in == null || in.isEmpty()) {
return new MyType();
}
// add other cases as necessary ...
}
}

然后你有

ArgumentFactory factory = new ArgumentFactory();
// ...
String value = "qwerty";
setter.invoke(object, argumentFactory.valueFor(value));

相关内容

最新更新