마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 Reflection에 대한 질문입니다.

0 추천
지금 특정 Library를 통해 안드로이드 앱을 개발하고 있습니다.

처음에 액티비티를 생성할 때 android.app.Activity 클래스대신 해당 Library의 Activity 클래스(가칭 NewActivity)를 상속받으며, NewAcitivity의 onCreate메소드를 오버라이딩 함으로써 수행됩니다.

그런데 저는 NewActivity 클래스의 private 필드(가칭 NewView)에 접근해야 합니다. 이 필드는 Library에 쓰이는 특정 뷰이며, 앱을 실행할 때 가장 처음에 뜨는 Custom View 입니다. 그리고 이 View는 Inflator로 생성된 View라서 findViewById()로 받아올 수 없습니다.

정리하면 NewActivity에서 Dynamic하게 생성되는 NewView에 접근해야 하는데 이 필드가 private 필드라서 저는 접근을 할 수 없습니다.

그래서 찾아보니 크게 두 가지 방법이 있는 것 같습니다.

 

1. 안드로이드 실행시 뜨는 최상위 뷰의 Id를 얻어온다. getResources()인가 WIndowManager클래스인가를 통해서 호출한다고 하는데 정확히 어떻게 하는 것인지는 모르겠습니다...ㅡ.ㅡ;; 좀 더 찾아봐야 할 것 같습니다.

2. Reflection을 이용한다. 제가 Reflection을 처음 써보는 지라 잘 안되더군요.
Class.forNmae()을 통해 NewActivity 클래스에 접근하고 getDeclaredField()로 NewView 필드를 불러온 후 Accessibility를 설정했는데 그 이후로는 잘 안됩니다.

 

 

정 안되면 java Decompiler로 jar Library를 해체한 후에 setter() 메소드를 설정하면 되겠습니다만, 될 수 있는한 이 방법은 피하고 싶습니다.

 

저 두가지의 방법 중 어떤 것을 써야 하는지, 그리고 가능하시다면 참고할 만한 자료나 URI가 좀 부탁드립니다.

감사합니다.
하늘위의 성 (120 포인트) 님이 2013년 3월 23일 질문

2개의 답변

0 추천
view 라면 getchildview 를 가져오는 형식으로 하면 될 것 같은데요
NoBrain (1,590 포인트) 님이 2013년 3월 23일 답변
0 추천
메서드와 멤버 필드의 구조를 아는 상태라면 리플렉션이 제일 좋을것 같네요.

그리고 액티비티 자신의 private 필드에 접근하는 상황이라면

Class.forName 이 아니라 this.getClass 로 접근해야 합니다.

접근해서 변수명으로 뷰를 가져왔다면, Accessbilty 바꿀 필요 없이 그냥 통상적인 뷰 다루듯이 하면 됩니다.
퐁풍 (8,740 포인트) 님이 2013년 3월 24일 답변
...