Japoul

热爱的事情应当不留余力

目录
实例对象赋值给Object转型后使用obj.getClass()导致获取不到正确实例属性问题
/      

实例对象赋值给Object转型后使用obj.getClass()导致获取不到正确实例属性问题 置顶!

最近在学习 JAVA 反射机制的时候,因为想要实现一下注解的检测实现机制,所以写了一下通过实例获取对应属性方法后再获取其上的注解进行操作.然后噼里啪啦一顿操作后测试运行:
错误1.png
😰 emmm 有错误很正常!打开浏览器搜索,全都是有关于 spring 的类型错误,可我没有用 spring 啊 QAQ ,好吧,打开调试大法,找到了错误位置:

调试1.png
这里的 obj 是我调用时传入的一个 Dog 类的实例, Dog 类有两个属性,一个 name 和一个 Property ,我们可以看到传入的 obj 的确是 Dog 的实例,按理说通过

obj.getClass().getDeclaredFields()

是可以获取到对应的两个属性的,可是这里获取到了20个属性.这些冒出来的东东是啥啊,其实如果看过 Class类 的话就会知道这是 Class类 中的属性,可以我这个小菜鸡母鸡呀,所以只好手动调试看看:
调式2.png
很明显看到直接使用 Dog 的实例和使用转型过的 obj 调用 getClass() 方法得到结果不一样,前者的得到的是 Dog 而后者得到的却是 Class ,这是因为通过 (Class) 强转的内容(强制转换的前提是 Class 是 Type 的实现类)得到的是实体类类路径;而通过 .getClass() 方法得到的是泛型类型,这里使用 obj.getClass() 得到的是 class类,而非实例类,会导致获取属性失败

所以我们只需要将obj.getClass().getDeclaredFields() 换为 ((Class)obj).getDeclaredFields() 就可以啦~

调式3.png

这样就对啦!

这里主要是因为我传入的 obj 是 Dog.class 才会这样,如果是 new Dog() 就不会这样了,直接使用getClass()即可.

评论