老师,请问为什么能通过反射获取到泛型的类型呢?

来源:3-5 Java 泛型的实现机制是怎样的?

慕九州6385248

2019-09-11

老师,你好:
关于泛型,我还是有两点疑问
1. 我定义了一个 List<String> list = new ArrayList<>();反编译查看并没有转化成 Object,还是 String,如果我自己实现了一个类,用到了泛型,反编译看还 <T>
2. 如果类型擦除了,为什么通过反射能获取到类型呢,是通过方法的签名吗

图片描述

图片描述

写回答

2回答

bennyhuo

2019-09-11

类型擦除是一定会有的,可能 jadx-gui 反编译的时候解析了签名信息。这个签名信息会在类和方法上有,其中包含泛型的参数信息,反射能够在一定条件下获取到泛型实参也是基于这个签名。

如果想要看类型擦除的现象,建议直接看字节码,Kotlin 的话在 IntelliJ 或者 Android Studio 里用 Show Kotlin Bytecode 就可以看到;Java 的话,安装一个 bytecode outline 就可以查看啦

1
1
慕九州6385248
已解决,感谢
2019-09-11
共1条回复

bennyhuo

2019-09-11

左边是代码,右边是字节码,字节码里面框起来的部分就是签名

//img.mukewang.com/szimg/5d78feb40912f57c19240590.jpg

1
0

大厂资深面试官 带你破解Android高级面试

改变视野和思维 深度与广度兼备的 Android 进阶面试指导课程

1636 学习 · 222 问题

查看课程