繁体   English   中英

如何从Java中的类名获取类型

[英]How to get a Type from class name in Java

我正在使用gson反序列化包含许多不同类的实例的json。 只要我预先了解所有课程,以下内容就会起作用:

    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。 如果另一个库使任务变得更容易,我们可以切换到它。

Gson的TokenType具有静态工厂方法,您可以像这样使用它:

public Type getType(String name) {
    try {
        Class<?> clazz = Class.forName(typeName);
        TypeToken<?> typeToken = TypeToken.get(clazz);
        return typeToken.getType();
    } catch (ClassNotFoundException e) {
        throw new IllegalArgumentException("Unsupported type: " + typeName, ce);
    }
}

这将使您了解不涉及泛型或通配符的大多数情况(或在通配符受限制的情况下,在这种情况下,您应获得边界上正确的参数化类型)。

免责声明:我尚未对此进行测试。

另外,您可能想查看Guava的TypeToken版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM