文章目录
前言
反射机制(Reflection mechanism)是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。但是由于反射机制能在运行时动态的对类进行装载,优点能够增加程序的灵活性,缺点是使用反射机制也会严重影响系统的性能,所以可以恰当的使用,下文从一个程序员小白的角度去解释了反射机制,感谢观看,可能专业术语不准确或哪处有逻辑语法错误,希望读者能够指正!
一、什么是SpringIOC?
1.Ioc(控制反转)
360百科:控制反转(Inversion of Control,英文缩写为IoC)是框架的重要特征。
也就是将两个类之间的赋值关系转换给第三方容器spring处理;两个类A和B 直接创建B 现在不直接创建而是交给第三方容器让它来新建。
2.反转的解释
谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。
例子: 在没有Spring之前,创建新对象的方式是new一个具体的对象();假设new ID:而ID的构造方法所需参数只需要个IDnumber类;
public class ID {
private ID IDnumber;
public ID(ID IDnumber) {
this.IDnumber = IDnumber;
}
}
此时创建一个ID对象需要先创建一个IDnumber对象
ID IDnumber=new ID(new IDnumber);
而IOC在这个过程中又发挥了什么作用呢?
Spring提供了IOC 为我们找到了类与类间的关系,我们需要的生活直接获取到,省略了创建对象所需的步骤;而IOC的底层是DI(依赖注入)而DI依赖于Java的反射机制。
3.DI(依赖注入)
依赖第三方容器对对象属性赋值
A{
B b=new B();
}
B{
}
A{
B b;给值就不叫控制反转
用的时候就得用依赖注入赋值,第三方容器依赖注入。
}
B{
}
4.Ioc的底层原理
注:此文章主要讲Java的反射机制所以不加过多别的赘述,着重于Java反射机制。
Spring 中的 IOC 的底层实现原理就是反射机制,Spring 的容器会帮我们创建实例,该容器中使用的方法就是反射,通过解析 xml 文件,获取到 id 属性和 class 属性里面的内容,利用反射原理创建配置文件里类的实例对象,存入到 Spring 的 bean 容器中。
二、什么是反射机制?
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。其中LEAD/LEAD++ 、OpenC++ 、MetaXa和OpenJava等就是基于反射机制的语言。
1.反射机制
理解如下:
编译期:源代码翻译—————>>计算机能识别的代码
Java代码————>JVM识别——>.class文件
运行期:将课执行文件交给操作系统去执行。
反射机制:在运行期间,对于任意的类都能够知道这个类的所有属性和方法,对于任意一个对象都能够调用它的任意方法和属性。
2.Java的反射机制
动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制,Java 的这一特性非常强大,并且是其它一些常用语言,如 C、C++、Fortran 或者 Pascal 等都不具备的。
三、反射机制的作用及使用场景
1.作用
1.运行时判断对象所属的类
2.运行时构造一个类的对象
3.运行时判断一个类所具有的成员变量和方法
4.运行时调用任意一个对象的方法
5.当我们在使用比如Ecplise时,当我们输入一个对象或者类,并想调用他的属性和方法是,一按点号,编译器就会自动列出他的 属性或者方法,这里就是用到反射。
2.使用场景
- 反编译(.class——>.java)
- JDBC 连接加载驱动
- 开发框架(通用性)
框架具有通用性,在编译期间不可以明确规定再创建什么。
Spring,SpringMVC框架都是反射机制来实现某些功能的。
不同的项目可使用相同的结构框架,框架需要根据配置文件加载不同的类和对象(运行期间,动态加载所需对象)
演示如下:
例1:
Class.forName("com.mysql.jdbc.Driver"); // 动态加载mysql驱动
例2:
<bean id="user" class="com.itmayiedu.User">
写完整路径的目的是:为了确保反射机制能够找到正确的类。
四.反射机制的应用
1.反射机制获取类的三种方式
//第一种方式:
Classa1=Class.forName("Employee");
//第二种方式:
//java中每个类都有class属性
Classa2=Employee.class;
//第三种方式:
//java语言中任何一个java对象都有getClass方法
Employee=new Employee();
Classa3=e.getClass();
//a3是运行时类(e的运行是类是Employee)
2.反射创建对象并获取对象的方式
无参构造演示如下:
有参构造演示如下:
2.禁止Java反射机制的方法
将构造函数私有化
演示如下:
注:实际上Java的反射机制也可以调用类的内部私有方法
(请参考链接: https://blog.youkuaiyun.com/xzz1173724284/article/details/88930972.)
五.反射机制的优缺点
1.优点
静态:编译时确定具体类型,绑定对象。
动态:运行时才会确定具体类型,能够降低类之间的耦合度最大限度发挥了java的灵活性。
2.缺点
对象原本是在编译器直接去创建,用户访问已存在,直接用反射机制必须在运行期间去创建对象,用户访问处于运行期间,一经访问发现还没创建,就要去创建对象,浪费时间,占用内存。
总结
以上就是我对反射机制的简单理解,本文简单说明了SpringIoc框架底层的关于反射机制的应用,和反射机制到底是什么,怎么应用及其使用场景和利用Java反射机制去创建和获取对象的具体操作,并且列出了反射机制的优缺点,虽然用Java反射机制对系统性能会产生影响,但仍然会使用。感谢观看!!!