您好,登录后才能下订单哦!
小编给大家分享一下Java反射机制在Spring IOC中怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
IOC:即“控制反转”,不是什么技术,而是一种思想。使用IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
本篇文章主要讲解一下IOC底层实现的原理(反射),Bean容器的实现,就不对IOC的概念进行详述了。
在Spring的配置文件中,经常看到如下配置:
<bean id="courseDao" class="com.qcjy.learning.Dao.impl.CourseDaoImpl"></bean>
那么通过这样配置,Spring是怎么帮我们实例化对象,并且放到容器中去了了?对,就是通过反射!!!
并放到容器中的伪代码:
//解析<bean .../>元素的id属性得到该字符串值为“courseDao” String idStr = "courseDao"; //解析<bean .../>元素的class属性得到该字符串值为“com.qcjy.learning.Dao.impl.CourseDaoImpl” String classStr = "com.qcjy.learning.Dao.impl.CourseDaoImpl"; //利用反射知识,通过classStr获取Class类对象 Class<?> cls = Class.forName(classStr); //实例化对象 Object obj = cls.newInstance(); //container表示Spring容器 container.put(idStr, obj);
通过解析xml文件,获取到id属性和class属性里面的内容,利用反射原理获取到配置里面类的实例对象,存入到Spring的bean容器中。
当一个类里面需要应用另一类的对象时,
<bean id="courseService" class="com.qcjy.learning.service.impl.CourseServiceImpl"> <!-- 控制调用setCourseDao()方法,将容器中的courseDao bean作为传入参数 --> <property name="courseDao" ref="courseDao"></property> </bean>
我们继续用伪代码的形式来模拟
//解析<property .../>元素的name属性得到该字符串值为“courseDao” String nameStr = "courseDao"; //解析<property .../>元素的ref属性得到该字符串值为“courseDao” String refStr = "courseDao"; //生成将要调用setter方法名 String setterName = "set" + nameStr.substring(0, 1).toUpperCase() + nameStr.substring(1); //获取spring容器中名为refStr的Bean,该Bean将会作为传入参数 Object paramBean = container.get(refStr); //获取setter方法的Method类,此处的cls是刚才反射代码得到的Class对象 Method setter = cls.getMethod(setterName, paramBean.getClass()); //调用invoke()方法,此处的obj是刚才反射代码得到的Object对象 setter.invoke(obj, paramBean);
通过上面对Spring底层原理的分析,可以发现,其实并不难,用到的都是反射机制,通过反射实例化对象,存入到Spring的bean容器中。
只要在代码或配置文件中看到类的完整路径(包.类),其底层原理基本上使用的就是Java的反射机制。
通过java语言中的反射机制可以i操作字节码文件(读和修改字节码文件)
通过反射机制可以操作代码片段(class文件)
在运行时判断一个对象所属的类
在运行时构造一个类的对象
在运行时判断一个类所具有成员变量和方法
在运行时调用一个对象的方法
java.lang.Class
: 代表整个字节码,代表一个类型,代表整个类。
java.lang.reflect.Method
: 代表字节码中的方法字节码,代表类中的方法。
java.lang.reflect.Contructor
: 代表字节码中的构造方法字节码,代表类中的构造方法。
java.lang.reflect.Field
: 代表字节码中的属性字节码,代表类中的成员变量。
代码如下(示例):
//java.lang.Class public class User{ //Field int no; //Constructor public User(){ } public User(int no){ this.no = no; } //Method public void setNo(int no){ this.no = no; } }
以上是“Java反射机制在Spring IOC中怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。