2012-04-20 5 views
1

임의의 오브젝트 그래프를 저장해야하는 저장 /로드 프레임 워크가 있습니다. 여기에는 비 정적 중첩 클래스의 인스턴스가 포함됩니다.어떻게하면 안드로이드에서 리플렉션을 통해 멤버 클래스를 인스턴스화 할 수 있습니까?

중첩 된 클래스는 생성 한 상위 클래스의 인스턴스에서 소유하며, 중첩 된 클래스는 합성 필드를 사용하여 속한 인스턴스를 인식합니다.

간단한 예를 들어, 내가이 클래스 제시 : "표준"컴파일러에

public class Foo implements Savable { 
    private class Bar implements Savable { 
    public void saveState(Saver saver) { 
     saver.putInt(3); 
    } 
    } 
    private Bar myBar = new Bar(); 
    public void saveState(Saver saver) { 
    saver.putSavable(myBar); 
    } 
} 

를, 다음 코드는 (객체 (myBar), 부모를 찾을에서 특정 인스턴스을 위해 잘 작동합니다) Foo의, 그리고 자녀와의 참조를 유지 : 내가 말했듯이

if (objectClass.isMemberClass()) { 
    //We are a member class, which means we are a non-static inner class, and therefore must save our parent. 
    Field[] fields = objectClass.getDeclaredFields(); 
    //We loop through each of our fields to find the synthetic field created by the compiler that points to our parent. 
    for (Field f : fields) { 
    String name = f.getName(); 
    //The synthetic field pointing to the parent is named something like "this$0". At least, with the "standard" compiler it is. 
    if (name.startsWith("this$")) { 
     f.setAccessible(true); 
     Savable parent = (Savable)f.get(objectClass); 
     saver.putSavable("_parent", parent); 
     break; 
    } 
    } 
    if (!saver.containsKey("_parent")) { 
    throw new RuntimeException("Could not find the owner of inner class: " + objectClass); 
    } 
} 

그래서,이 그냥 "표준"컴파일러에에서 잘 작동합니다. 그런 다음로드 타임에 부모 클래스의 인스턴스를 가져 와서 인스턴스를 생성하고 부모를 전달하는 생성자를 찾는 점을 제외하면 비슷한 점이 발생합니다.

하지만!

Android VM에서는 작동하지 않습니다. 합성 필드는 없으며 생성자는 부모 인스턴스를 사용하지 않는 것처럼 모두 정상적으로 보입니다.

여기 있습니까? 이 VM은 내 접근 방식을 분명히 좋아하지 않습니다. 내부 클래스가 자신의 부모 클래스 인스턴스에 대한 참조를 저장해야한다는 것을 알 필요없이 여기서 할 수있는 일이 있습니까?

+0

ooi whats SOL mean? – Blundell

+0

그것은 "$ #! % 행운을 빕니다" –

답변

0

좋아, 내가 틀린 나무를 짖고 있었다는 것이 밝혀졌다. 내가 설명한 방법은 안드로이드 에서뿐만 아니라 다른 곳에서도 완벽하게 작동합니다. 문제는이 경우에 인스턴스화하려고 시도했던 클래스가 static 내부 클래스라는 것입니다. 따라서 구성원 인 클래스의 경우 외부 클래스에 대한 참조가 없었습니다. 합성 생성자/필드를 찾기 전에 if (!Modifier.isStatic(objectClass.getModifiers()))을 확인하기 만하면됩니다.

관련 문제