반성 할 수는 있지만 여기서는 다른 것을해야한다고 생각합니다. 유틸리티 기능을
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}
개체 유형별로 개체를 호출하고 싶지는 않습니다. 이 클래스에 액세스하는 여러 빈 유형이 있으며 모두 똑같은 작업을 수행합니다. 그들은 모두 id 속성을 가지고 있으므로 클래스에 액세스 할 모든 객체에 내 키를 설정해도 안전합니다. 그러나 사용 가능 여부를 확인하는 것이 좋을 것입니다. – ryandlf
클래스를 알고 있으므로 속성을 확인하는 좋은 방법 인 것 같습니다. 그렇다면 빈 유형을 캐스팅하지 않고 객체에 키를 설정하는 것은 어떻습니까? – ryandlf
은 내 편집 내용을 필요에 맞게 바 꾸었습니다. 아무 것도 변환 할 필요가 없습니다. 메소드가 있는지 점검하고 메소드를 호출합니다. –