Java的反射机制的简单理解

本文介绍了Java反射机制的基本概念,包括其在运行时动态检查和操作类的能力,以及其在Spring框架中控制反转(IOC)的底层原理。文章详细阐述了IOC的四个部分,强调了依赖注入(DI)的重要性。此外,还讨论了反射机制的作用,如动态获取类信息、创建对象等,以及在JDBC连接和框架开发中的应用。同时,提到了反射的优缺点,包括提高灵活性但可能影响性能。最后,给出了反射机制创建和获取对象的示例。
摘要由CSDN通过智能技术生成


前言

反射机制(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.使用场景

  1. 反编译(.class——>.java)
  2. JDBC 连接加载驱动
  3. 开发框架(通用性)
    框架具有通用性,在编译期间不可以明确规定再创建什么。
    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.csdn.net/xzz1173724284/article/details/88930972.)

五.反射机制的优缺点

1.优点

静态:编译时确定具体类型,绑定对象。
动态:运行时才会确定具体类型,能够降低类之间的耦合度最大限度发挥了java的灵活性。

2.缺点

对象原本是在编译器直接去创建,用户访问已存在,直接用反射机制必须在运行期间去创建对象,用户访问处于运行期间,一经访问发现还没创建,就要去创建对象,浪费时间,占用内存。


总结

以上就是我对反射机制的简单理解,本文简单说明了SpringIoc框架底层的关于反射机制的应用,和反射机制到底是什么,怎么应用及其使用场景和利用Java反射机制去创建和获取对象的具体操作,并且列出了反射机制的优缺点,虽然用Java反射机制对系统性能会产生影响,但仍然会使用。感谢观看!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值