我正试图通过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
}
}
其中field
的SomeType
可以是基元、包装器或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));