現(xiàn)象:Child
繼承Parent
并聲明了泛型類型
class Parent<T>{...}
class TestViewModel extends ViewModel{...}
class Child extends Parent<TestViewModel>{...}
Child c = new Child();
通過反射獲取對象c
的泛型類型偶爾會返回java.lang.Object
類型。
原因:混淆時會將未用到泛型信息擦除卷中,即在對象c
未使用到泛型T
相關(guān)的方法或?qū)ο髸r矛双;
解決:修改混淆規(guī)則
#保持泛型
-keepattributes Signature
-keepattributes Exceptions
#對應(yīng)泛型T的class不混淆
-keep public class * extends androidx.lifecycle.ViewModel
反射獲取泛型類型的方法:
public static <T> Class<T> getGenericClass(Class<?> klass) {
Type type = klass.getGenericSuperclass();
if (!(type instanceof ParameterizedType)) return null;
ParameterizedType parameterizedType = (ParameterizedType) type;
Type[] types = parameterizedType.getActualTypeArguments();
if (types.length == 0) return null;
return (Class<T>) types[0];