gsonを使用して、多くの異なるクラスのインスタンスを含むjsonを逆シリアル化しています。次の作品は限り私はアップフロントのすべてのクラスを知っているとして、次のようJavaのクラス名から型を取得する方法
String receivedPayloadStr = receivedMessage.get("payload");
Type payloadType = getType(receivedMessage.get("type").toString());
Object typedPayload = gson.fromJson(payloadJson, payloadType);
System.out.println(typedPayload);
私のgetType機能は次のとおりです。
、短期的に動作しますが、醜いと壊れやすいstatic Type getType(String typeName){
switch (typeName){
case "mypackage1.MyThing1":
return new TypeToken<MyThing1>() {}.getType();
case "mypackage2.MyThing1":
return new TypeToken<MyThing2>() {}.getType();
default:
throw new RuntimeException("Unsupported type: " + typeName);
}
}
。明らかに、私たちはより保守的なアプローチを望んでいます。一般的な方法でgetTypeを実装する方法があるので、それは既知のすべてのクラスをサポートしていますか?
編集:私たちはgsonに限定されません。別のライブラリがタスクを容易にする場合は、そのライブラリに切り替えることができます。私はそれをテストdidntの が、それは正しいようだ:
これは[guava docs](https://github.com/google/guava/wiki/ReflectionExplained)で既に説明しています。クラスオブジェクトを使用しますが、名前で簡単に解決できます。あなたのアプローチでは、型の下限を取得することしかできないことに注意してください。 –
@ M.Prokhorov確かに、私はグアバを使うことができました。クラス名からTypeを取得する例を提供できますか? – AlexC