2011-12-15 6 views
4

클래스 이름과 가변 개수의 인수 (즉, 가변 길이의 Object [] args)를 사용하여 Java에서 클래스를 만들고 싶습니다. 그것을 달성 할 수있는 방법이 있습니까?Java의 Javascript .apply() 메소드는 무엇입니까?

기본적으로, 방법은 함수가

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

감사 같을 것이다에만 전화에

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 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) Java에서 [varargs] (http://docs.oracle.com/javase/6/docs/technotes/guides/language/varargs.html)를 사용하는 기능 또는 2) [메소드를 호출하는 방법] reflection] (http://docs.oracle.com/javase/6/docs/api/java/lang/reflect/Method.html#invoke (java.lang.Object, % 20java.lang.Object ...)) 그 이름과 논쟁의 배열이 주어지면? 제목과 질문 본문이 잘 맞지 않습니다. –

+0

나는 varargs를 찾고 있지 않다. 함수에 임의의 매개 변수 목록을 적용 *하고 싶습니다. 내 질문도 편집했습니다. –

+0

Object에 vararg를 사용하십시오. Java가 메소드에 대해 알 수없는 유형의 인수를 허용하는 유일한 방법입니다. – Stefan

답변

6

Invoke() 함수에 Object []를 제공하고 Javascript에서 정확히 .apply()과 똑같이 작동한다는 것이 판명되었습니다. 다음 기능을 수행하십시오.

같은 클래스에서
public int multiply(int int1, int int2) { 
    return int1*int2; 
} 

, 그것은 classesints

Class[] classes = new Class[] {int.class, int.class}; 
Object[] ints = new Object[] {2,3};  
같은 것을 지원을 위해 모두

감사 인 상태

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

같은 함수를 호출하기 위해 노력!

1

난 당신이 뭔가를 필요가 있다고 생각합니다. 메소드를 호출하는 리플렉션을 사용할 수 있습니다.

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

을하지만, 자바 스크립트와는 달리 당신은 강력한 타이핑을 가지고 있고 당신이 좋아하는 생성자 말을 :

 Method method = Class.forName("className").getMethod("methodName", Parameter1.class, Parameter2.class); 

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

은 다음과 같이 간다.

+0

과부하가 발생했기 때문에 강력한 유형 때문이 아닙니다. –

+0

알려진 양의 매개 변수가있는 경우 이미 이것을 사용하지만 모든 목록이나 매개 변수 (즉, 가변 크기의 Object [] args)를 처리하고이를 클래스에 적용 할 수 있기를 원합니다. 그게 가능할까요? –

+0

옵션은 다음과 같습니다. 1) 배열의 클래스 배열 만들기 2)이 배열과 일치하는 적절한 생성자를 찾으려는 생성자를 반복합니다. 이것은 마지막 elipsis 논쟁 때문에 까다로울 수 있습니다. 피코/스프링과 같은 DI 컨테이너는 자동 와이어 링하는 동안 동일하게 작동합니다. 하지만 여전히 그루비가 될 수있는 옵션이 있습니다. JVM에서 실행되어 Java를 향상시킵니다. –

관련 문제