无public构造类的实例化------TypeToken

一直在用Gson处理json,对下面这句的写法很疑问:

Map<String, Object> jsonMap = gson.fromJson(jsonStr, new TypeToken<HashMap<String, Object>>(){}.getType());

主要疑问点在于TypeToken的实例化方式,这种带括号的匿名内部类的写法主要用于实现抽象类,点进typeToken的源码发现,并没有发现抽象类的标志,觉得很奇怪。再仔细看了下源码,发现这个类并没有public的构造方法,只有default和protected的构造方法,那么就无法直接实现这个类,根据java的权限继承,通过继承这个类,我们能够实现实例化这个没有public构造方法的类。而这里的大括号代表的就是java的匿名内部类的写法,能够简化代码。
这里限定通过这种方式来实例化Typetoken主要是强制限定使用的时候指定明确的类型,通过生成匿名内部类,可以在编译的时候把泛型信息保留在字节码中,虽然在运行时由于类型擦除,泛型类和非泛型类都一样,但是泛型信息是在字节码中保留下来了,相关信息被保存在class字节码常量池中,使用了泛型的代码处会生成一个signature签名字段,通过 签名signature字段指明这个常量池的地址,然后在运行的时候就可以被 getType()方法用反射API获取运行时类提取到,避免由于泛型的类型擦除而无法获取到相应类型。

猜你喜欢

转载自blog.csdn.net/qq_36666651/article/details/79950480
今日推荐