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

Casting a String to another type as a parameter of a method in Java reflection

提问人:Evgeny Kuznetsov 提问时间:9/18/2022 最后编辑:Mark RotteveelEvgeny Kuznetsov 更新时间:9/18/2022 访问量:457

问:

我正在尝试通过 Java 中的反射将值传递给方法。

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

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

假设,我们有一个没有 args-contructor 的类,一个字段和一个方法,一个 setter 方法:int fieldsetTheField

public class SomeClass{
    private SomeType field;

    SomeClass(){};

    public void setTheField(SomeType parameter){
        this.field = parameter
    }
} 

其中 of 可以是原始的、包装的或 / 。SomeTypefieldLocalDateLocalDateTime

如果我拿二传手(说):

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!");
}

那么我真正想做的,是传递到某个物体上的“二传手”,因为我需要以某种方式猫,但我无法弄清楚如何统一地做到这一点。stringSomeClass object = new SomeClass();setter.invoke(object, value);String valueSomeType

不过,这似乎是一个标准的情况,我希望在 Java 中比我更开明的人能够快速弄清楚该怎么做。

欢迎任何建议。

补遗:

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

Java 反射 转换

评论

0赞 Krzysztof Cichocki 9/18/2022
字符串已经是 Object,您可以通过调用 method.getParameterTypes() 来获取参数类型,但据我所知没有必要,它的类型还可以,那么它应该没问题,你的问题是什么?

答:

0赞 geco17 9/18/2022 #1

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

假设: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));

评论

0赞 Evgeny Kuznetsov 9/18/2022
我在问题的文本中添加了一些上下文。
0赞 Evgeny Kuznetsov 9/19/2022
好吧,既然没有人建议其他方法来做我想做的事,我接受这个特定的答案。似乎这种方法是不可避免的。ArgumentFactory