反射可以做到這一點,但我想也許在這裏你應該做點別的。 寫效用函數
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.
}
}
這裏是工作示例我有,只是複製粘貼運行。
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();
}
}
}
和預期的輸出結果是:
p = MyParent{parentKey=parentKey}
o = MyObj{myKey=myKey} MyParent{parentKey=myParentKey}
我不想通過它的類型調用對象。我有多個訪問這個類的bean類型,並且完全一樣。它們都有一個id屬性,因此它可以安全地將我的密鑰設置在任何將訪問該類的對象上。但是,驗證其可用的檢查會很好。 – ryandlf 2012-01-04 05:35:24
我知道這個班,所以這看起來像是一個檢查房產的好方法。那麼如何設置對象上的鍵而不用強制bean類型呢? – ryandlf 2012-01-04 05:58:50
更改了我的編輯以滿足您的需求 - 無需轉換任何內容。它檢查是否有方法並調用它。 – 2012-01-04 06:03:20