안드로이드 개발 질문/답변
(글 수 45,052)
반갑습니다. 아주 오랜만에 질문 계시판을 활용하게 되었는데요..
runtime 단에서 Object 를 가져와 Instance를 하고 사용할 수 있는 reflection 을 활용해야 될거 같은데..
문제는 이놈이 newInstance를 하니 InstantiationException 에러가 저를 반갑게? 맞이해 주는군요..
잘 모르는 부분이라 에러가 반갑지 않지만 구굴님과 함께라면 언제나 든든 하리라 생각하며 열심히 삽질?을 해봤지만..
아래와 같은 방법으로 dump를 해보니.. 제가 instance를 해야 할 method 안에 abstract 형 Method가
무진장 많다는건 확실히 알아 냈습니다...ㅋㅋㅋ (웃을 일은 아니지만)
try {
Class c = Class.forName("*****");
Method m[] = c.getDeclaredMethods();
for (int i = 0; i < m.length; i++)
System.out.println(m[i].toString());
} catch (Throwable e) {
System.err.println(e);
}
생성자 확인을 아래와 같이 하니 Context가 생성자로 쓰고 있는걸 확인했습니다.
Class cls = Class.forName("**********");
Constructor ctorlist[] = cls.getDeclaredConstructors();
for (int i = 0; i < ctorlist.length; i++) {
Constructor ct = ctorlist[i];
System.out.println("name = " + ct.getName());
System.out
.println("decl class = " + ct.getDeclaringClass());
Class pvec[] = ct.getParameterTypes();
for (int j = 0; j < pvec.length; j++)
System.out.println("param #" + j + " " + pvec[j]);
Class evec[] = ct.getExceptionTypes();
for (int j = 0; j < evec.length; j++)
System.out.println("exc #" + j + " " + evec[j]);
System.out.println("-----");
}
} catch (Throwable e) {
System.err.println(e);
}
아래와 같이 newInstance를 하였는데..
Class cls = Class.forName("**********");
//Constructor ct = cls.getConstructor(new Class[]{Context.class});
Constructor ct = cls.getDeclaredConstructor(new Class[]{Context.class});
if(!ct.isAccessible()){
ct.setAccessible(true);
Window window = (Window)ct.newInstance(new Object[]{context});
ct.setAccessible(false);
}else{
Window window = (Window)ct.newInstance(new Object[]{context});
}
젠장..ㅠㅠ 나름 열심히 찾아서 잘 될 줄 알았는데 저에게 돌아 오는것은
03-17 14:57:20.635: WARN/System.err(2571): java.lang.InstantiationException: ******************
아무리 영어가 짧아도 저 말뜻은 느낌이 안좋다느건 단번에 알 수 있겠더군요..ㅠㅠ
어떻게 해야 컴파일러가 제 말끼를 알아 들을 수 있을까요?
고수님들 간만에 몸좀 풀어 주세요~!! ㅎㅎ
PS: 환절기에 방사능 조심합시다.~
2011.03.18 08:54:18
자세한 로그가 없어 짐작합니다. Context 클래스에 public 으로 인자가 없는 생성자가 존재하지 않아 발생하는 예외가 아닐까합니다만 어플리케이션 컨텍스트로 인자를 변경하면 어떨지 궁굼하군요...
2011.03.18 09:48:50
Context 클래스나 Window 클래스의 인스턴스를 직접 만들려고 하는 것 자체가 잘못된 겁니다.
이 클래스는 안드로이드 프레임워크에서 만들어주는 걸 받아서 써야 합니다.
윗분 말씀처럼 받아서 쓰는 식으로 변경하세요.
이 클래스는 안드로이드 프레임워크에서 만들어주는 걸 받아서 써야 합니다.
윗분 말씀처럼 받아서 쓰는 식으로 변경하세요.
2011.03.29 16:36:41
Class 내부에 abstract method 를 포함하고 있다는것은...
이걸로는 instance 생성해서 쓰지 말라는 말입니다.
다들 아시겠지만, 실제로는 그 Class 를 상속받아서 정의한 다른 Class 가 있습니다.
그 Class 로 instance 생성하셔야 합니다.
다만, 상속관계에 있으므로 생성은 자식 클래스로 하시고 받아오시는 타입은 부모 클래스로 하셔서 사용하셔도 됩니다.
하지만 reflection 쓰고 계시니 뭐 의미 없겠죠.
어쨋든 어서 빨리 자식 클래스를 찾아보시죠.
안드로이드 Full Source 받아보시면 금방 답 나옵니다.



