2017-04-04 11 views
0

개체 생성자의 서명과 거의 같은 외부 원본 문자열을받습니다. 클래스 이름과 매개 변수가 들어 있습니다. 예를 들어Java 리플렉션을 사용하여 개체 만들기

:

public class Foo { 
    public Foo(int x, int y, int z) { 
    // do something 
    } 
} 

public class Bar { 
    public Bar (int x, boolean bool) { 
    // do something 
    } 
} 

의 내가 이런 많은 클래스가 있고, 내가받은 문자열을 기반으로 이러한 클래스에서 객체를 생성하고 싶은 말은하자 (즉 클래스 이름과 paramters을 포함). 이 작업을 수행 할 수 있습니까?

는 나는이 같은 것을 사용하여 클래스를 얻을 수 있습니다 알고

String className = "myClass"; 
Class<?> myClass = Class.forName(className); 
//Constructor<?> ctor = myClass.getConstructor(); 
//Object object = ctor.newInstance(new Object[] { ctorArgument }); 

을하지만 컴파일시에 모르는 경우 어떻게 생성자 및 유형의가 얼마나 많은 paramters 객체를 인스턴스화 할 수 있습니다 그들은 될 것인가? 그건 그렇고, 내가 원하는 개체 클래스를 만드는 가장 가능성이 단 하나의 생성자를 사용할 수 있습니다. 그러나 각 클래스는 다른 클래스와 다른 생성자를 가질 수 있습니다.

+0

: 예 - 그것은 부울 필드'Boolean.valueOf (argStr) '등의 경우 그런 다음 convertStringToActualType() 예를 들어 .. 실제 매개 변수에 문자열 값을 변환하는 방법을 알고 있어야합니다 생성자에 대한 인수의 수 및 유형. 그러나 어느 시점에서 전달할 값을 결정해야합니다. –

+0

전달하려는 값은받은 문자열에서 파싱됩니다. 다음과 같이 보일 수 있습니다. "Foo (4,5,7) "또는"Bar (1, true) ". – Johnny

답변

0

없음 문제 newInstance() 방법은 배열을 받기 때문에 :

그래서
public T newInstance(Object ... initargs) 

그냥 모든 인수를 포함하는 배열을 초기화하고 통과를 그것과 같은

뭔가 :

String[] argsAsString = readValuesFromString(data); 
Object[] args = new Object[argAsString.length()]; 
int i = 0; 
Class<?>[] paramTypes = ctor.getParameterTypes(); 
for (String argStr: argsAsString) { 
    args[i] = convertStringToActualType(argStr, paramTypes[i]); 
    i++; 
} 

ctor.newInstance(args); 

당신에게 아마도 getConstructors()을 클래스에 호출 한 다음 올바른 수의 인수로 생성자를 찾으려고합니다. 동일한 수의 인수를 가진 두 개 이상의 생성자가없는 경우에만 작동합니다. 그런 다음를 얻기 위해 반사를 사용할 수

Object convertStringToActualType(String arg, Class<?> type) { 
    if (type == String.class) 
     return arg; 
    if (type == Boolean.class) 
     return Boolean.valueOf(arg); 
    throw new IllegalArgumentException("type " + type.getSimpleName() + " not supported"); 
} 
+0

답변 해 주셔서 감사합니다. 예제로 보여준 코드를 완성하고 실행 해 보았습니다. 그러나 나는'arguments [i] = convertStringToActualType (argStr, paramTypes [i]);'할 때 다음과 같은'예외 스레드 "메인"java.lang.ArrayStoreException : java.lang.Boolean'을 얻습니다. 배열이 부울을 저장할 수없는 것처럼 보입니다. – Johnny

+1

여기에 문제가있는 것 같습니다. Object [] args = new String [argAsString.length()]; 'Object [] args = new Object [argsAsString.length]; ' – Johnny

+0

네, 죄송합니다. 오타였습니다. 결정된 – paranoidAndroid

관련 문제