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

标签 java java-8 gson

我正在使用 gson 反序列化包含许多不同类实例的 json。只要我事先知道所有类(class),以下内容就有效:

    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 .

关于java - 如何从 Java 中的类名获取类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45083910/

相关文章:

java - repaint() 方法不会重新绘制我的屏幕

java - SimpleDateFormat 显示太多信息

java - 用Java读取带有标题和多列的CSV文件

android - 使用自定义 Gson 反序列化器反序列化 JSON 响应时出错

kotlin - Kotlin使用Gson转义正斜线

java - GSON 不区分大小写的枚举反序列化

java - java中迭代器的使用

java - OpenJdK 8 - 无法编译包 javafx.util 不存在

java - 如何将 Lambda 表达式写入方法引用?

java - 在 java 8+ 中分组时对 HashMap 中每个键的值进行排序列表