2012-01-04 9 views
0

これは可能ですか?私はこのコードでJSON文字列からオブジェクトを作成しています:汎用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()セッターを使用してBeanオブジェクト上でそのキーを設定する、いくつかのデータベースのものを行うリターンキー値を取得し、しかし、私は汎用オブジェクトに特定のタイプのオブジェクトをキャストする必要はありません。オブジェクトをキャストするために同じコードを何度も繰り返す必要があるからです。

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); 

これ以上の変換のようにそれを呼び出すことができます。

EDIT:「オブジェクト」を使用すると、あなたはここで反射

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. 
     } 
    } 

を使用することができ制約である場合には、単にコピー&ペースト・ランを、私が持っている実施例です。

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(); 
     } 
    } 
} 

と予想される出力は次のようになります。あなたは(あなたが言及したように)「複数のBeanタイプ」と「彼らはすべてのidプロパティを持っている」がある場合は、なぜあなたは定義されていない

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

私はオブジェクトをその型で呼び出す必要はありません。私はこのクラスにアクセスする複数のBean型を持ち、まったく同じことをします。それらはすべてidプロパティを持っているので、クラスにアクセスするすべてのオブジェクトにキーを設定しても安全です。しかし、その利用可能性を確認するためのチェックがうまくいくでしょう。 – ryandlf

+0

私はクラスを知っているので、プロパティをチェックする良い方法のように見えます。 Bean型をキャストせずにオブジェクトのキーを設定するのはどうでしょうか? – ryandlf

+0

あなたのニーズに合わせて編集を変更しました。何も変換する必要はありません。メソッドがあるかどうかをチェックし、メソッドを呼び出す。 –

0

setIdメソッドを使ってBeanの共通インタフェースを使用するか?

あなたは豆を手に入れ、インターフェイスにキャストするだけで、安全でオブジェクト指向のアプローチになります。それはあなたのために実行可能なソリューションですか?

+0

Beanのidプロパティは、一致する唯一のプロパティに関するものです。あなたのソリューションはまだまだ良い方法でしょうか? – ryandlf

+0

間違いなく。任意の種類の非オブジェクト型の使用は、Javaが強力な型言語であるため、はるかに優れています。インターフェイスを使用する場合は、私が以前提案した関数を使用することができます。 'public static T fromJson(String json、Class clzz)' –

0

ここに私の作業コードです。何らかの理由で、私はメソッドの配列をループし、存在していたsetIdメソッドに名前を一致させなければならなかったので、class.getMethod()を使ってメソッドを見つけることができませんでした。そこから、プロパティを正しく設定する鍵がinvokeを使用していました。

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(); 
      } 
     }   
    } 
} 
関連する問題