有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Proguard破坏了我的清洁。Gson和泛型

我有一个从持久性加载信息的函数,我只是用一种非常简单的方式告诉类型。这个类叫做SharedPreferencesHelper.kt,所以它是一个真正的生活问题解决者:

    fun <T> loadList(context: Context, fileName: String, key: String, defValue: ArrayList<T>) : ArrayList<T> {
        val gson = MyGsonDependency.getInstance()
        val json = getWithFileName(context, fileName).getString(key, gson.toJson(defValue))

        return gson.fromJson(json, object : TypeToken<ArrayList<T>>() {}.type)
    }

例如,要加载ArrayList<String>,我只需执行以下操作:

   SharedPreferencesHelper.loadList<String>(
            context,
            FILE_NAME,
            KEY,
            ArrayList())

我发现的问题是,当我运行Proguard并混淆我的代码时,每当我调用object : TypeToken<ArrayList<T>>() {}.type时,我都会得到一个异常:

Caused by: java.lang.AssertionError: illegal type variable reference
   at libcore.reflect.TypeVariableImpl.resolve(TypeVariableImpl.java:111)
   at libcore.reflect.TypeVariableImpl.getGenericDeclaration(TypeVariableImpl.java:125)
   at libcore.reflect.TypeVariableImpl.hashCode(TypeVariableImpl.java:47)
   at java.util.Arrays.hashCode(Arrays.java:4074)
   at com.google.gson.internal.$Gson$Types$ParameterizedTypeImpl.hashCode(Unknown Source:2)
   at com.google.gson.reflect.TypeToken.<init>(Unknown Source:23)

我找到的唯一解决方案是was here,但它意味着提供type作为参数

我认为这是一个潜在的问题,原因有二:

  • 这不是警告,也不是坏习惯(是吗?),这是一个非常好的函数,在加载之后序列化的JSONArray时可以节省大量样板代码。当Proguard处于顶层时,同一项目的开发人员可能没有意识到这是一个问题
  • 测试一段代码是否有效的唯一方法是运行Proguard,换句话说,平均等待3分钟进行构建。在单元和UI测试中有一个大的测试覆盖率也有很大帮助,但有些团队没有这种可能性

我的问题是,有没有其他方法来解决这个问题


共 (0) 个答案