反射的应用
- ide里面的自动提示,我们在键入代码时,其实ide对应的程序就处于运行期,通过收集我们的键入,来推测键入的代码是否是一个变量,如果是一个变量的话,在键入"."以后,就会通过反射获取相应的Class对象,来进行相关的提示。
- IoC中对象的生成,就是通过反射。
所有类的相关信息,都只有在spring启动时,才能确定。每个项目注入的bean不同,但最终的伪代码是一致的,伪代码中为了注入真实的对象,不可能针对不同的项目编写相关的new ClassName类似的高度耦合的代码,只能用反射来获取相关的实例对象。
相关的伪代码
<bean id="courseService" class="com.qcjy.learning.service.impl.CourseServiceImpl">
<!-- 控制调用setCourseDao()方法,将容器中的courseDao bean作为传入参数 -->
<property name="courseDao" ref="courseDao"></property>
</bean>
string class1 = "xxx.xxx.courseService";
string class2 = "xxx.xxx.courseDao";
Class clazz1 = Class.forName(class1);
Class clazz2 = Class.forName(class2);
Method method = clazz1.getMethod(class1 setcourseDao 相关方法);
method.invoke(clazz1, clazz2);
反射为什么慢
- 反射底层会调用cpp代码,JVM在执行java和cpp代码时的上下文信息、相关组件肯定是不一样的,切换上下文信息和相关组件意味着时间消耗->性能损耗->慢。
- Method.invoke()源码中,形参是Object类型的可变长参数,Object对象在具体使用时,会进行强制类型转换,意味着时间消耗->性能损耗->慢。