2012-01-30 2 views
0

이전에 json에서 객체로 데이터를 직렬화하기 위해 리플렉션을 사용하는 응용 프로그램을 작성했으며 그 솔루션이 정상적으로 작동했습니다. 지금 나는이 응용 프로그램의 V2.0에서 일하고있다. 그리고 나는 서비스의 모든 모델 논리를 격리하고 활동 계층을 그것으로부터 분리하려고 노력 중이다. 이 서비스의 목적은 서비스가 백그라운드에서 살며 웹 서비스에 대한 정기 업데이트를 실행할 수 있다는 것입니다. 내 문제는 필자가 리플렉션을 사용하여 소멸 가능한 인터페이스를 구현하는 객체를 인스턴스화하는 순간 InstantiationException을 던집니다. 내 생각 엔 parcelable 인터페이스가 어떤 식 으로든 객체의 기본 생성자를 방해한다는 것입니다.parcelable 인터페이스를 구현하는 객체에서 Java 리플렉션을 사용할 수 있습니까?

하나의 해결책은 내가 작성한 객체를 만들어 올바른 객체를 생성하고 IPC에서 그 객체를 전송하는 것입니다. 그러나 필자는 아직 생각하지 못했던 어떤 방식으로도 parcelable을 사용하는 간단한 해결책이있을 것이라고 생각한다.

public class ManagedObjectWrapper {

private Object anObject;//the instance of the object itself 
    private Class<?> theClass;//Metadata 
    private Field[] declaredFields;//Metadata 

    public ManagedObjectWrapper(Class<?> c){ 

     theClass=c; 
     declaredFields = c.getDeclaredFields(); 
     try { 
          //this is where it crashes 
      anObject = c.newInstance(); 
     } catch (InstantiationException e) { 

      e.printStackTrace(); 
     } catch (IllegalAccessException e){ 
      e.printStackTrace(); 
     } 
    } 

    public Object GetObject(){return this.anObject;} 
    public Class<?> GetClass(){return this.theClass;} 
    public Field[] GetDeclaredFields(){return this.declaredFields;} 

}

이것은 내가 JSON 네, 할 수

private ArrayList<ManagedObjectWrapper> getObjectsFromJSON(String pluralizedColumn,JSONArray array) throws Exception 
    { 
     ArrayList<ManagedObjectWrapper> returnList = new ArrayList<ManagedObjectWrapper>(); 
     String packageName = extContext.getPackageName(); 
     String singularObjectName = pluralizedColumn.substring(0, pluralizedColumn.length()-1);//remove the plural s 
     String canonicalClassName = packageName.concat(".").concat(singularObjectName); 
     Class<?> theClass = Class.forName(canonicalClassName); 

     for(int i = 0;i < array.length(); i++){ 

      ManagedObjectWrapper mow = new ManagedObjectWrapper(theClass); 

      JSONObject obj = array.getJSONObject(i); 
       for(Field field : mow.GetDeclaredFields()){ 
         Class<?>[] params = {field.getType() 
          }; 
        if(!field.getName().contentEquals("CREATOR")){ 
         Method setterMethod = mow.GetClass().getDeclaredMethod(SET_METHOD_PREFIX.concat(field.getName()),params); 
         Object nullTest = obj.get(field.getName()); 

        if(nullTest.equals(null)){ 

         }else{ 
          setterMethod.invoke(mow.GetObject(), obj.get(field.getName())); 
         } 
        } 

       } 

     returnList.add(mow); 
    } 

답변

0

에서 내 개체를 얻기 위해 반사를 사용하는 방법입니다. 클래스의 기본 생성자를 구현하기 만하면 코드에서 숨겨진 다른 오류가 훨씬 간단 해 졌다고 생각하게되었습니다. 그러나이 문제로 되돌아 가서 다시 시도해보십시오. 이전처럼 작동합니다.

관련 문제