学习 反射时, 老师要求我们要 “沐浴更衣”, “三天吃素”, 因为 它很神圣。
反射技术是 Java 语言的灵魂。可惜当时经验不足, 没有抓住机会和老师探讨探讨。
由于反射技术的大部分方法都是由 .dll 文件实现, 只能调用其提供的 API 接口, 接口练习的代码, 下文贴出。
练习使用反射技术时, 感觉它像 Java 给 开的 “后门”。
通过它, 可以对对象做所有代码层面可以做的事情。
运用时体会到 设计者 强大的 脑回路, 和平时开发过程中完全不同的思维;
核心部件: 类模板(Class 对象)。
程序员书写的每一个类都有唯一的一个类模板, 里面包含了该类的所有信息。 包括: 类的声明信息, 属性, 行为, 父类等等;
且提供的对应的 API 获取描述信息(手册)。
通过获取到的信息, 可以直接通过类模板进行生成对象,调用, 赋值等等;
查找属性和方法的主要方式: 属性名/方法名;
即: 拿到了属性名和方法名的字符串, 就可以通过类模板操作这些属性和方法(受访问控制权限的影响, private, public 等等);
这也就是为什么, SpringMVC, Mybatis, Json转换等框架如此依赖于 get set 方法, 依赖 属性名,方法名的对应和正确性的原因, 因为他们都是基于 反射 进行架构的。
测试期间, 让人惊讶的是思维的转换: 按照惯性思维, 一般是先找到对象, 然后根据对象修改相应的属性值; 反射则是通过模板先找到 类 中的属性对应的模块, 然后再针对对象, 对该模块的值进行操作。
早期一直好奇, 为什么 SpringMVC 可以做到 自动的将前端传送的 Json 对象转换封装为 对应的 Java 对象,很神奇! 今天才明白它也是运用的 反射进行对象的封装, 相同的属性名, 赋值对应的值。 对象克隆也可运用反射, 后文有代码示例。
总之: 明白一点点 反射的知识后, 之前很多疑问都迎刃而解了。