2012-05-07 4 views
1

String을 기반으로 클래스를 인스턴스화해야 할 경우 (예 : JSON에서 로직 생성) 어떻게 작성해야합니까?Java의 String 클래스 참조를 얻으려면 어떻게해야합니까?

초기 생각은 스위치 였지만 Android 프레임 워크의 Java 버전에서는 switch 문이 문자열을 허용하지 않는 것처럼 보입니다. 이 작동하지 않는

private HashMap<String, Class> classMap = new HashMap<String, Class>(); 
classMap.put("someClass", SomeClass.class)? 
// ... etc 
String someString = jsonObject.getString("someProperty"); 
Class classRef = classMap.get(someString); 
SomeSuperClass classInstance = new classRef(); 

:

다음 생각은 HashMap의했다. 오히려 if/else의 가능성 목록이 길어질 것입니다. 지도를 사용하여 clazz.newInstance();

+1

자바 없음 버전 문자열 switch 문 수 (자바 7을 제외하고,하지만 모두가 그 조용한 우리를 유지하는 단지 신화 알고있다). – Tharwen

답변

4

그냥 그런 다음 인스턴스를 Class<?> clazz = Class.forName("com.yourpackage.YourClass")를 사용합니다. 클래스를 올바르게 인스턴스 화하지 않고 있습니다.

Class classRef = classMap.get(someString); 
SomeSuperClass classInstance = classRef.newInstance(); 
+0

끝내 주셔서 고맙습니다. (6 분) – momo

+0

이것은 Class 클래스의 참조가 아닌 Object 클래스의 참조를 반환합니다. –

+3

@Bhavik 첫 번째 줄 Class.forName ("...")은 클래스 참조를 반환합니다. 두 번째 줄은이를 인스턴스화하고 객체를 만듭니다. –

0

귀하의 접근 방식은 내가 할 것 인 것이다 (그리고 당신이 공장 패턴 구현에 나타납니다) :

1

생성자 매개 변수를 사용하여 클래스를로드 할 수도 있습니다.

예.

public static void load(String p) 
    throws ClassNotFoundException, InstantiationException, 
    IllegalAccessException{ 
     Class cl = classLoader.loadClass(p); 
     Constructor c = cl.getConstructor(String.class); 
     Plugin plug = (Plugin) c.newInstance("myArgument"); 
    } 
+0

생성 된 Plugin 인스턴스를 반환하지 않아야하나요? – Natix

+0

생성 된'Plugin' 인스턴스를 반환 할 수는 있지만, 의도적으로 객체의 인스턴스를 생성 할 수있는 예제를 표시하는 것이 었습니다. –

+0

@BhavikAmbani - 재미 있고, 감사합니다. – momo

관련 문제