2011-12-15 4 views
4

Я хочу создать класс в Java из имени класса и переменной количества аргументов (т. Е. Аргументов Object [] с переменной длиной). Есть ли способ достичь этого?Javascript .apply() эквивалент метода в 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 
+0

Что именно вы ищете? 1) Возможность использования [varargs] (http://docs.oracle.com/javase/6/docs/technotes/guides/language/varargs.html) в Java или 2) Возможность [вызывать метод через отражения] (http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Method.html#invoke (java.lang.Object,% 20java.lang.Object ...)) учитывая его имя и массив аргументов? Ваше название и вопрос не совсем совпадают. –

+0

Я не ищу varargs. Я хочу * применить * произвольный список параметров к функции. Также отредактировал мой вопрос :) –

+0

Используйте vararg с Object. Это единственный способ заставить Java принимать любое количество аргументов неизвестного типа для метода. – Stefan

ответ

6

Оказалось, что вы можете просто предоставить объект [] функции invoke() и что он будет работать точно так же, как .apply() в Javascript. Возьмите следующую функцию.

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

Из того же класса, он работает, чтобы вызвать функцию как

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

с classes и 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 У вас есть сильный набор текста и должен сказать, какой конструктор вы хотите иметь.

+0

Это из-за перегрузки, а не из-за сильных типов. –

+0

Я уже использую это, если у меня есть известное количество параметров, но я хочу иметь возможность иметь дело с любым списком или параметрами (т. Е. Аргументами Object [] переменного размера) и применять это к классу. Это возможно? –

+0

Ваш вариант: 1) построить массив классов в вашем массиве. 2) перебрать конструкторы, пытаясь найти подходящий конструктор, соответствующий этому массиву. Это может быть сложно из-за последнего аргумента elipsis. Контейнеры DI, такие как pico/spring, делают то же самое при автоподготовке. Но у вас все еще есть возможность пойти на groovy - он работает на JVM и увеличивает java –