【问题标题】:Javascript .apply() method equivalent in Java?Java中等效的Javascript .apply()方法?
【发布时间】:2012-01-21 04:38:07
【问题描述】:

我想从类名和可变数量的参数(即具有可变长度的 Object[] 参数)在 Java 中创建一个类。有什么方法可以实现吗?

基本上,该方法在 Javascript 中看起来像这样

function createClass(classname, args) {
    protoObject = Object.create(window[classname].prototype);
    return window[classname].apply(protoObject,args) || protoObject;
}
// I want to be able to do this:
var resultClass = createClass("someClass", someArrayOfArgs);

只调用一个函数的更简单的函数看起来像

function callFunction(functionName, args) {
    return window[functionName].apply(null,args);
}

谢谢!


为了澄清,这将是 Javascript 中的一些示例用法:

function multiplyResult(var1,var2) { 
    return var1*var2;
}
var result = callFunction("multiplyResult", ["5", "2"]); // == 10

function multiplyObject(var1,var2) { 
    var result = var1 * var2;
    this.getResult = function() { return result }; 
}
var result = createClass("multiplyObject", ["5", "2"]).getResult(); // == 10

【问题讨论】:

  • 您到底在寻找哪个? 1) 在 Java 中使用 varargs 的能力,或者 2) 给定名称和参数数组的 invoke a method via reflection 的能力?您的标题和问题正文不太一致。
  • 我不是在寻找可变参数。我想 apply 一个函数的任意参数列表。也编辑了我的问题:)
  • 对对象使用可变参数。这是让 Java 为方法接受任意数量的未知类型参数的唯一方法。
  • 这能回答你的问题吗? Java spread operator

标签: java javascript parameters apply


【解决方案1】:

事实证明,您可以简单地为invoke() 函数提供一个Object[],并且它的工作方式与Javascript 中的.apply() 完全相同。取如下函数。

public int multiply(int int1, int int2) {
    return int1*int2;
}

从同一个类中,它可以像这样调用函数

Object result = this.getClass().getDeclaredMethod("multiply",classes).invoke(this,ints);

classesints 类似于

Class[] classes = new Class[] {int.class, int.class};
Object[] ints = new Object[] {2,3};    

【讨论】:

    【解决方案2】:

    我认为你需要这样的东西。您可以使用反射来调用方法。

          Method method =  Class.forName("className").getMethod("methodName", Parameter1.class, Parameter2.class);
    
          MethodReturnType result= (MethodReturnType) method.invoke(Class.forName("className"), new Object[]{parameter1, parameter2});
    

    【讨论】:

      【解决方案3】:

      是这样的:

       Class.forName("foo").clazz.getConstructor(<classes>).newInstance(... parameters)
      

      但与 javascript 不同的是,你有强类型,并且必须说出你喜欢哪个构造函数。

      【讨论】:

      • 那是因为重载,而不是因为强类型。
      • 如果我有已知数量的参数,我已经使用它,但我希望能够处理任何列表或参数(即可变大小的 Object[] args)并将其应用于班级。这可能吗?
      • 您的选择是:1) 在您的数组中构建类数组 2) 迭代构造函数,试图找到与该数组匹配的合适构造函数。由于最后一个省略号参数,这可能很棘手。像 pico / spring 这样的 DI 容器在自动装配时也是如此。但是你仍然可以选择 groovy - 它在 JVM 上运行并增强了 java
      • 感谢您的回答!事实证明,我可以简单地为 getConstructor() 和 newInstance() 提供一个 Object[],这样就可以了。
      • 没那么容易。您必须先从对象中提取类,然后按顺序将它们打包到数组中。如果有空对象,你就会迷路。在这种情况下,您将需要更复杂的构造函数发现策略。 (只需使用适当数量的参数调用所有构造函数,并捕获 InvalidArgumentException 直到您用完构造函数或成功将是其中之一)
      猜你喜欢
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 2014-04-06
      • 2012-10-01
      • 2021-06-04
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      相关资源
      最近更新 更多