Android Gson解析泛型及接口中泛型获取、接口泛型混淆相关问题

Android应用开发 专栏收录该内容
56 篇文章 1 订阅

Gson解析泛型

解析方式:
一、
应用场景:除接口外其他类,获取泛型类型,进行解析。混淆时需要keep 此类。

泛型Type/Class获取

Type t = mBaseEntity.getClass().getGenericSuperclass();
Type claz = ((ParameterizedType) t).getActualTypeArguments()[0];
Class claz = mBaseEntity.getResultType();

解析

T mResponse = new Gson().fromJson(body, claz);

二、
应用场景:接口中的泛型,获取泛型类型,进行解析。混淆时需要keep 此接口。

接口

    public interface CssCallback<T> {
        void onResponse(T mResponse);

        void onFailure(Call<?> call, Throwable t);
    }

泛型Type/Class获取

//Class<T>tClass=null;//根据当前类获取泛型的
TypeTypetypeOfT=null;Type[]interfacesTypes=null!=mCallback?mCallback.getClass().getGenericInterfaces(): null;

if(null!=interfacesTypes){
	for(Typet: interfacesTypes){
		Type[]genericType2=((ParameterizedType)t).getActualTypeArguments();
		//接口有几个泛型参数,genericType2size一般就为几。
		for(Typet2: genericType2){
			//tClass=(Class<T>)t2;typeOfT=t2;
		}
	}
}

解析

/*if(null!=tClass){
	mResponse=(T)newGson().fromJson(body,tClass);
}*/
if(null!=typeOfT){
	T mResponse=newGson().fromJson(body,
	typeOfT);
}

三、
应用场景:均可使用,但混淆时无法使用,无论是否忽略类接口泛型混淆都不行。

泛型类型获取

Class claz=null;
Method[]ms=null!=mCallback?mCallback.getClass().getDeclaredMethods(): null;
if(null!=ms){
	for(Methodm: ms){
		if(!TextUtils.equals(null!=m?m.getName(): "","onResponse"))continue;
		Class[]paramTypes=null!=m?m.getParameterTypes(): null;
		if(null!=paramTypes
		&&paramTypes.length==1
		&&BaseEntity.class.isAssignableFrom(paramTypes[0])){
			claz=paramTypes[0];
			if(!claz.isAssignableFrom(CssCallback.class)){
				break;
			}
		}
	}
}

解析

if(null!=claz){
T mResponse=(T)newGson().fromJson(body,claz);
}

总结:
因为Android release打包时正常都会对代码进行混淆,所以方法三基本可以废弃,在方法一和方法二中自由选择,注意使用场景。两个方法的本质区别是getGenericSuperclass()getGenericInterfaces()

接口中泛型混淆问题

    public interface CssCallback<T> {
        void onResponse(T mResponse);

        void onFailure(Call<?> call, Throwable t);
    }

如上接口包含有泛型,混淆时添加接口keep,泛型keep,使用方法三获取泛型类型并解析,但泛型始终会被定义成Object,解析失败。

混淆配置


# 避免混淆泛型
-keepattributes Signature

外部接口

-keep public interface com.XXX.XXX.XXX.CssCallback{ *; }

内部接口

-keep public interface com.XXX.XXX.XXX.RequestManager$CssCallback{ *; }
  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值