【问题标题】:Java function call with changing parameter amount更改参数量的 Java 函数调用
【发布时间】:2019-08-10 12:57:36
【问题描述】:

我有一个问题。 当我的程序运行时,我收到一个带有参数的请求(我事先不知道确切的数量)、一个函数名和一个类名。我在运行时加载类并想调用请求中给出的方法。我现在的问题是: 如何调用参数变化量的函数?

myClass.getMethod(this.metaData.getFunctionName(), java.lang.Integer);

这将是一个正常的呼叫。 但我想要这样的东西

myClass.getMethod(this.metaData.getFunctionName(), ..args);

或者像这样

myClass.getMethod(this.metaData.getFunctionName(), for(param p: in request = new param));

我知道这是不可能的,但可以通过其他方式实现吗?还是我必须提前知道确切的金额?

编辑解决方案: @LppEdd 发布了解决方案,@DawoodibnKareem 也在 cmets 中说。如果你有一个用 (...args) 定义的函数,你可以传递一个数组,数组的每个元素都算作一个传递的参数。

我知道这是非常不安全的,但该项目以某种方式提供了安全性。

rgds, 丹尼斯

【问题讨论】:

  • 听起来很危险。谁在发送此请求?
  • 所有参数都是同类型的吗?
  • 一个客户端正在发送这个请求,参数是不同类型的,它们甚至可以是自定义对象。
  • 这听起来非常不安全。

标签: java function methods dynamic runtime


【解决方案1】:

你可能想要类似的东西

private Class<?>[] buildParameterTypes(final List<String> types) {
    return types.stream()
                .map(typeStr -> {
                    try {
                        return Class.forName(typeStr);
                    } catch (final ClassNotFoundException e) {
                        throw new IllegalArgumentException(e);
                    }
                }).toArray(Class[]::new);
}

用法

myClass.getMethod(this.metaData.getFunctionName(), buildParameterTypes(strTypeList));

请求必须将参数类型作为String 数组发送。

[
  "java.lang.String",
  "java.lang.Integer",
  ...
]

但是,是的,不要这样做。
顺便说一句,您是在谈论网络请求吗?什么样的要求?

【讨论】:

  • 这就是解决方案。但我的赞成票将不可见。它来自一个 post 请求,这个请求被映射到一个 Request 对象。但是在这个项目中以某种方式给出了安全性^^。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-10
相关资源
最近更新 更多