Java反射机制在Spring IOC中的应用详解

网友投稿 362 2022-12-05

Java反射机制在Spring IOC中的应用详解

目录java反射机制在Spring IOC的应用下面是Spring通过配置进行实例化对象Spring的配置如下所示实现一下Spring底层处理原理反射机制、反射机制的作用、反射机制的功能1、反射机制的作用2、Java反射机制的功能3、反射机制相关的重要的类有哪些?

Java反射机制在Spring IOC的应用

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

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

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

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

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

并放到容器中的伪代码:

//解析元素的id属性得到该字符串值为“courseDao”

String idStr = "courseDao";

//解析元素的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容器中。

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

Spring的配置如下所示

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

实现一下Spring底层处理原理

//解析元素的name属性得到该字符串值为“courseDao”

StriaDpUQng nameStr = "courseDao";

//解析元素的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的反射机制。

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

1、反射机制的作用

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

通过反射机制可以操作代码片段(class文件)

2、Java反射机制的功能

在运行时判断一个对象所属的类

在运行时构造一个类的对象

在运行时判断一个类所具有成员变量和方法

在运行时调用一个对象的方法

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

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;

http:// }

//Method

public void setNo(int no){

this.no = no;

}

}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SpringCloudAlibaba整合Feign实现远程HTTP调用的简单示例
下一篇:一文了解MyBatis Plus批量数据插入功能
相关文章

 发表评论

暂时没有评论,来抢沙发吧~