2009-11-18 2 views
5

정말 추상적 인 응용 프로그램을 만들기 위해 필자는 매개 변수 유형을 알지 못하고 매개 변수를 String 형식으로 만 모르는 채로 메서드를 호출해야합니다.getClass(). getMethod ("name", 알 수 없음)

제가이 방법을 가지고 있다고 가정 해 보겠습니다.

getNames(String like, int amount); 

그리고 나는 2 개의 매개 변수를 포함하는 문자열 배열을 가지고 있습니다.

String[] params = new String[] {"jack", "25"}; 

params 배열을 사용하여이 메서드를 가져올 수있는 방법이 있습니까?

답변

2

당신은 동적 프로그래밍에 대한


String[] params = new String[] {"jack", "25"}; 
Object[] realParams = new Object[params.length]; 
Method[] methods = getClass().getMethods(); 
for (Method method : methods) { 
    if (method.getParameterTypes().length == params.length) { 
    for (int i = 0; i < method.getParameterTypes().length; i ++) { 
     Class<?> paramClass = method.getParameterTypes()[i]; 
     if (paramClass = String.class) { 
      realParams.add(param); 
     } else if (paramClass == Integer.class || paramClass == Integer.TYPE) { 
      realParams.add(Integer.parseInt(param)); 
     } else if (other primitive wrappers) { 
      ... 
     } else { 
      realParams.add(null); // can't create a random object based on just string 
      // you can have some object factory here, or use ObjectInputStream 
     } 
    } 
    break; // you can continue here if the parameters weren't converted successfully,  
    //to attempt another method with the same arguments count. 
    } 
} 
+0

메서드를 알면 필요한 매개 변수로 문자열을 캐스팅 할 수 있습니까? 예를 들어 주시겠습니까? – Thys

+0

그 솔루션을 사용하면 같은 수의 인수로 두 개의 메소드를 가질 수 없습니다. 실행할 메서드의 이름이나 사용할 매개 변수의 형식을 말하지 않으면이 방법을 사용할 수 없습니다. –

+0

내 업데이트 확인 – Bozho

1

소리가 메타 프로그래밍과 유사합니다. JVM 플랫폼에 설정되어 있다면 Groovy/Scala를 살펴 보는 것이 좋습니다.

0

자바 리플렉션 API를 살펴보면 매개 변수의 유형을 확인하는 데 필요한 정보를 제공 할 수 있어야합니다. 그런 다음 리플렉션 API를 통해이 메소드에 대해 알려준 내용을 기반으로 목록을 반복하고 지능적으로 각각을 캐스팅해야합니다.

0

동적 프로그래밍 언어를 사용하여 시도 할 수 있습니다. Java는 그런 종류의 물건에는 적합하지 않습니다.

어쨌든 리플렉션 API를 살펴 보았지만 응용 프로그램과 같은 많은 프로그래밍을 계획하고 있다면 다른 대안을 고려하십시오.

관련 문제