提问人:Evgeny Kuznetsov 提问时间:9/18/2022 最后编辑:Mark RotteveelEvgeny Kuznetsov 更新时间:9/18/2022 访问量:457
在 Java 反射中将 String 作为方法的参数转换为另一种类型
Casting a String to another type as a parameter of a method in Java reflection
问:
我正在尝试通过 Java 中的反射将值传递给方法。
也就是说,假设我们有字符串
String value = (some string representation of a value of type Type);
假设,我们有一个没有 args-contructor 的类,一个字段和一个方法,一个 setter 方法:int field
setTheField
public class SomeClass{
private SomeType field;
SomeClass(){};
public void setTheField(SomeType parameter){
this.field = parameter
}
}
其中 of 可以是原始的、包装的或 / 。SomeType
field
LocalDate
LocalDateTime
如果我拿二传手(说):
Method setter = SomeClass.getClass().getDeclaredMethods()[0];
然后找出它的参数(比如):
parametersList = Arrays.stream(setter.getParameters())
.collect(Collectors.toList());
然后,如果检查 setter 是否需要单个参数:
if (parametersList.size() != 1) {
throw new IllegalArgumentException("Setter named = " +
setter.getName() +
" is not a single parameter setter!");
}
那么我真正想做的,是传递到某个物体上的“二传手”,因为我需要以某种方式猫,但我无法弄清楚如何统一地做到这一点。string
SomeClass object = new SomeClass();
setter.invoke(object, value);
String value
SomeType
不过,这似乎是一个标准的情况,我希望在 Java 中比我更开明的人能够快速弄清楚该怎么做。
欢迎任何建议。
补遗:
我在这里再详细说明一些。
我正在尝试执行的任务如下。假设我有一个针对方法(或字段)的注释。假设我还有一些域类,其中一些 setter(字段)注释为 .我必须从带有列名的CSV顶行读取(将数据链接到注释名称的标题),然后我必须返回我的域类的对象列表。这就是我使用反射的原因,我看不出其他办法。@Column{String name}
SomeClass
@Column
SomeClass
答:
如果没有更多的上下文,这看起来像是一个设计问题。为什么要通过反射来获取 setter 并给出一个 ,得到一个与 setter 参数类型兼容的值?如果没有其他方法可以解决这个问题,则不可能将 a 强制转换为其他类型。一种可能性是制作工厂类。String
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));
评论
ArgumentFactory
评论