2012-01-04 2 views
0

이것이 가능합니까?) (세터를일반 Java Bean에 대한 등록 정보 설정

String obj = new Gson().toJson(jsonArray.getJSONObject(i)); 
String className = getClassName(jsonArray.getJSONObject(i)); 

Class targetClass = null; 
try { 
    targetClass = Class.forName(className); 
} catch (ClassNotFoundException e) { 
       e.printStackTrace(); 
} 

//Create Object 
Object data = new Gson().fromJson(obj, targetClass); 
난 후 일부 데이터베이스 물건을 할

는, 반환 키 값을 얻을 나는 그것의 setId를 사용하여 빈 객체에 해당 키를 설정하려면 :이 코드를 사용하여 JSON 문자열에서 객체를 생성하고 ,하지만 그 개체를 던지기 위해 동일한 코드를 여러 번 반복해야하기 때문에 특정 유형의 개체를 일반 개체로 캐스팅하지 않아도됩니다.

key = contactsListDAO.manageDataObj(data, sql, true); 
((PhoneNumber) data).setId(key); 

나는 객체가 ID 속성을 포함하고 주조 할 필요없이 일반 객체의 ID를 설정할 수 있는지 확인하는 if 문의 일종을 사용할 수 있습니까?

답변

0

반성 할 수는 있지만 여기서는 다른 것을해야한다고 생각합니다. 유틸리티 기능을

public static <T> T fromJson(String json, Class<T> clzz) 
{ 
return (T) new Gson().fromJson(obj, targetClass); 
} 

쓰기 당신은 너무

PhoneNumber data = fromJson(obj, PhoneNumber.class); 

더 이상 변환처럼 호출 할 수 있습니다.

편집 : "개체"를 사용하는 것은 제약이 경우 반사 여기

public void setIdOnObject(Object obj, Object id) 
    { 
     try{ 
     Method m = obj.getClass().getMethod("setId",id.getClass()); 
      m.invoke(obj, id); 

     }catch(NoSuchMethodException e){ return false; } catch (InvocationTargetException e) { 
      e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. 
     } 
    } 

사용할 수있는 것은 I, 그냥 복사 - 붙여 넣기 - 실행이 작동하는 예이다.

import java.lang.reflect.InvocationTargetException; 
public class Reflection 
{ 

    public static void main(String[] args) 
    { 
     MyParent p = new MyParent(); 
     setParentKey(p, "parentKey"); 

     MyObj o = new MyObj(); 
     setParentKey(o, "myParentKey"); 
     setMyKey(o, "myKey"); 

     System.out.println("p = " + p); 
     System.out.println("o = " + o); 

    } 



    public static void invokeMethod(Object p, Object k, String methodName) 
    { 
     try 
     { 
      p.getClass().getMethod(methodName, k.getClass()).invoke(p, k); 
     } 
     catch (NoSuchMethodException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (InvocationTargetException e) 
     { 
      e.printStackTrace(); 
     } 
     catch (IllegalAccessException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    public static void setParentKey(Object p, Object k) 
    { 
      invokeMethod(p,k,"setParentKey"); 
    } 

    public static void setMyKey(Object p, Object k) 
    { 
     invokeMethod(p,k,"setMyKey"); 
    } 

    public static class MyParent 
    { 
     private Object parentKey; 
     public void setParentKey(String k) 
     { 
      parentKey = k; 
     } 

     @Override 
     public String toString() 
     { 
      return "MyParent{" + 
          "parentKey=" + parentKey + 
          '}'; 
     } 
    } 

    public static class MyObj extends MyParent 
    { 
     private Object myKey; 
     public void setMyKey(String k) 
     { 
      myKey = k; 
     } 

     @Override 
     public String toString() 
     { 
      return "MyObj{" + 
          "myKey=" + myKey + 
          "} " + super.toString(); 
     } 
    } 
} 

그리고 예상 출력은 다음과 같습니다 당신이 (당신이 언급으로) "여러 콩 종류"와 "그들은 모두에 id 속성이"이있는 경우, 당신은 왜를 정의하지

p = MyParent{parentKey=parentKey} 
o = MyObj{myKey=myKey} MyParent{parentKey=myParentKey} 
+0

개체 유형별로 개체를 호출하고 싶지는 않습니다. 이 클래스에 액세스하는 여러 빈 유형이 있으며 모두 똑같은 작업을 수행합니다. 그들은 모두 id 속성을 가지고 있으므로 클래스에 액세스 할 모든 객체에 내 키를 설정해도 안전합니다. 그러나 사용 가능 여부를 확인하는 것이 좋을 것입니다. – ryandlf

+0

클래스를 알고 있으므로 속성을 확인하는 좋은 방법 인 것 같습니다. 그렇다면 빈 유형을 캐스팅하지 않고 객체에 키를 설정하는 것은 어떻습니까? – ryandlf

+0

은 내 편집 내용을 필요에 맞게 바 꾸었습니다. 아무 것도 변환 할 필요가 없습니다. 메소드가 있는지 점검하고 메소드를 호출합니다. –

0

setId 메소드가있는 빈에 대한 공용 인터페이스?

콩을 가져 와서 인터페이스에 캐스트하면 안전하고 객체 지향적 인 접근 방식이됩니다. 그것은 당신을위한 실행 가능한 솔루션입니까?

+0

빈의 id 속성은 일치하는 유일한 속성입니다. 당신의 해결책은 여전히 ​​더 나은 접근 방법이 될 것입니까? – ryandlf

+0

확실히.자바가 강력한 타입 언어이기 때문에 어떤 종류의 비 Object 타입을 사용하는 것이 훨씬 낫다. 인터페이스를 사용한다면 이전에 제안한 기능을 사용할 수 있습니다. 'public static T fromJson (String json, Class clzz)' –

0

다음은 제 작업 코드입니다. 어떤 이유로 나는 class.getMethod()를 사용하여 메소드를 찾을 수 없었습니다. 그래서 배열의 메소드를 반복하고 존재하는 것으로 알고있는 setId 메소드에 이름을 일치시켜야했습니다. 거기에서 호출을 사용하여 올바르게 속성을 설정하는 열쇠가되었습니다.

public void setIdOnObject(Object obj, int id, Class<?> targetClass) { 
    Method[] methods = targetClass.getMethods(); 
    for(Method i : methods) { 
     if(i.getName().equals("setId")) { 
      try { 
       i.invoke(obj, id); 
      } catch (IllegalArgumentException e) { 
       e.printStackTrace(); 
      } catch (IllegalAccessException e) { 
       e.printStackTrace(); 
      } catch (InvocationTargetException e) { 
       e.printStackTrace(); 
      } 
     }   
    } 
}