经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring » 查看文章
Java反射机制在Spring IOC中的应用详解
来源:jb51  时间:2021/9/27 11:05:59  对本文有异议

Java反射机制在Spring IOC的应用

IOC:即“控制反转”,不是什么技术,而是一种思想。使用IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。

本篇文章主要讲解一下IOC底层实现的原理(反射),Bean容器的实现,就不对IOC的概念进行详述了。

在Spring的配置文件中,经常看到如下配置:

  1. <bean id="courseDao" class="com.qcjy.learning.Dao.impl.CourseDaoImpl"></bean>

那么通过这样配置,Spring是怎么帮我们实例化对象,并且放到容器中去了了?对,就是通过反射!!!

下面是Spring通过配置进行实例化对象

并放到容器中的伪代码:

  1. //解析<bean .../>元素的id属性得到该字符串值为“courseDao”
  2. String idStr = "courseDao";
  3. //解析<bean .../>元素的class属性得到该字符串值为“com.qcjy.learning.Dao.impl.CourseDaoImpl”
  4. String classStr = "com.qcjy.learning.Dao.impl.CourseDaoImpl";
  5. //利用反射知识,通过classStr获取Class类对象
  6. Class<?> cls = Class.forName(classStr);
  7. //实例化对象
  8. Object obj = cls.newInstance();
  9. //container表示Spring容器
  10. container.put(idStr, obj);

通过解析xml文件,获取到id属性和class属性里面的内容,利用反射原理获取到配置里面类的实例对象,存入到Spring的bean容器中。

当一个类里面需要应用另一类的对象时,

Spring的配置如下所示

  1. <bean id="courseService" class="com.qcjy.learning.service.impl.CourseServiceImpl">
  2. <!-- 控制调用setCourseDao()方法,将容器中的courseDao bean作为传入参数 -->
  3. <property name="courseDao" ref="courseDao"></property>
  4. </bean>

我们继续用伪代码的形式来模拟

实现一下Spring底层处理原理

  1. //解析<property .../>元素的name属性得到该字符串值为“courseDao”
  2. String nameStr = "courseDao";
  3. //解析<property .../>元素的ref属性得到该字符串值为“courseDao”
  4. String refStr = "courseDao";
  5. //生成将要调用setter方法名
  6. String setterName = "set" + nameStr.substring(0, 1).toUpperCase()
  7. + nameStr.substring(1);
  8. //获取spring容器中名为refStr的Bean,该Bean将会作为传入参数
  9. Object paramBean = container.get(refStr);
  10. //获取setter方法的Method类,此处的cls是刚才反射代码得到的Class对象
  11. Method setter = cls.getMethod(setterName, paramBean.getClass());
  12. //调用invoke()方法,此处的obj是刚才反射代码得到的Object对象
  13. setter.invoke(obj, paramBean);

通过上面对Spring底层原理的分析,可以发现,其实并不难,用到的都是反射机制,通过反射实例化对象,存入到Spring的bean容器中。

只要在代码或配置文件中看到类的完整路径(包.类),其底层原理基本上使用的就是Java的反射机制。

反射机制、反射机制的作用、反射机制的功能

1、反射机制的作用

  • 通过java语言中的反射机制可以i操作字节码文件(读和修改字节码文件)
  • 通过反射机制可以操作代码片段(class文件)

2、Java反射机制的功能

  • 在运行时判断一个对象所属的类
  • 在运行时构造一个类的对象
  • 在运行时判断一个类所具有成员变量和方法
  • 在运行时调用一个对象的方法

3、反射机制相关的重要的类有哪些?

  • java.lang.Class : 代表整个字节码,代表一个类型,代表整个类。
  • java.lang.reflect.Method : 代表字节码中的方法字节码,代表类中的方法。
  • java.lang.reflect.Contructor : 代表字节码中的构造方法字节码,代表类中的构造方法。
  • java.lang.reflect.Field : 代表字节码中的属性字节码,代表类中的成员变量。

代码如下(示例):

  1. //java.lang.Class
  2. public class User{
  3. //Field
  4. int no;
  5. //Constructor
  6. public User(){
  7. }
  8. public User(int no){
  9. this.no = no;
  10. }
  11. //Method
  12. public void setNo(int no){
  13. this.no = no;
  14. }
  15. }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号