【java 查漏补缺】彻底理解反射的原理

前言

再学习java的过程中,反射是非常的重要,官方给的解释如下:

Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键

如果不能彻底理解,那么请看我下面的讲解

1、什么是反射

为什么叫反射呢,在物理学中,比如你照镜子,镜子里有一个一摸一样的你,这就是反射。至于java中是怎么做到的呢,请看下图。
在这里插入图片描述

首先java源码经过编译,变成Cat.class文件,然后通过类加载器将字节码文件加载到内存里,其中方法区存储了Cat类的相关信息
在这里插入图片描述
然后堆里存储了Class 类的对象(一个类中只有一个class对象),这个对象包含了类的完整结构信息(不是咱们说的Cat类,指的是组合成一个类的元素),这个类对象有几个核心的方法,如下图,可以得到成员变量、方法、构造器等。通过这个class 对象得到类的结构,这个class对象就像一面镜子,透过这个镜子看到类的结构,所以形象的称之为反射。
在这里插入图片描述
在这里插入图片描述

这里在说一下多态的原理:

在这里插入图片描述
如上图,cat 对象和cat2 对象知道他们是属于哪个Class 对象,这就映射了多态,通过父类引用调用子类的方法,可以实现不同对象的多种行为,而无需关心具体的对象类型

比如有一个接口Anmial
Animal myCat = new Cat();:这里使用 Animal 类型的变量引用 Cat 对象,
Animal myDog = new Dog();:同样使用 Animal 类型的变量引用 Dog 对象。

现在这么一说,是不是对于多态的底层原理也醍醐灌顶了。

从堆和方法区看反射的底层原理

在这里插入图片描述
首先class 类对象有堆方法区中字节码二进制数据的引用,这就可以解释动态加载的逻辑,方法区存储的是类的数据结构信息,在运行时通过class.forname(全限定类名) 创建出一个对象,这个对象是根据方法区中字节码创建出来的,方法区里面的类的数据结构就是一个模板,动态的创建对象,这就是二者之间的关系

2 例子

接下来简单列举一个例子,看看反射是如何编译完得程序动态创建对象得
1、src 下新建一个文件,文件内容如下
在这里插入图片描述

classfullpath=com.hspedu.Cat
method=hi

2、然后新建一个类

public class Cat {
   

    private String name = "招财猫";
    public int age =<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值