Java中的等效Javascript .apply()方法是什么?

6
我希望能够通过类名和可变数量的参数(即长度可变的Object[] args)在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)通过反射调用一个方法(http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Method.html#invoke(java.lang.Object,%20java.lang.Object...)),给定它的名称和参数数组?你的标题和问题内容不太一致。 - Rob Hruska
我不是在寻找可变参数。我想要将任意列表的参数“应用”到一个函数中。我也已经编辑了我的问题 :) - Willem Mulder
使用带有 Object 的 vararg 是唯一可以让 Java 接受一个未知类型的任意数量参数的方法。 - Stefan
这个回答解决了你的问题吗?Java扩展运算符 - Krzysztof Atłasik
3个回答

9

原来你可以简单地提供一个 Object[]invoke() 函数,它会像 Javascript 中的 .apply() 一样正常工作。看下面这个函数。

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

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

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

使用整数作为示例:

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

1
我认为你需要类似这样的东西。你可以使用反射来调用一个方法。
      Method method =  Class.forName("className").getMethod("methodName", Parameter1.class, Parameter2.class);

      MethodReturnType result= (MethodReturnType) method.invoke(Class.forName("className"), new Object[]{parameter1, parameter2});

1

内容如下:

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

但与JavaScript不同的是,您具有强类型,并且必须指定要使用的构造函数。


这是因为重载,而不是因为强类型。 - Mathias Schwarz
我已经使用了这个方法,如果参数数量是已知的话。但是我希望能够处理任何参数列表(即变量大小的Object[] args),并将其应用于该类。这是否可能? - Willem Mulder
你的选择可能是:1)在数组中构建类的数组;2)迭代构造函数,尝试找到与此数组匹配的合适构造函数。由于最后一个省略号参数,这可能有些棘手。像Pico / Spring这样的DI容器在自动装配时也会执行相同的操作。但你仍然可以选择使用Groovy - 它在JVM上运行并增强了Java。 - Konstantin Pribluda
谢谢您的回答!事实证明,我可以简单地提供一个Object[]给getConstructor()和newInstance(),这样就可以工作了。 - Willem Mulder
不是那么容易。你首先需要从对象中提取类,并按顺序将它们打包成数组。如果存在空对象,你就会迷失方向。在这种情况下,你需要更复杂的构造函数发现策略。(只需调用具有适当数量参数的所有构造函数,并捕获InvalidArgumentException,直到你用完所有构造函数或成功为止) - Konstantin Pribluda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接