Java反射机制

本文详细探讨了Java反射机制,解释了什么是反射以及其与正射的区别。通过分析反射创建对象的过程,特别是Method的invoke方法的底层实现,揭示了从获取Class对象到调用方法的内部逻辑,涉及MethodAccessor接口和本地方法invoke0的调用。
摘要由CSDN通过智能技术生成

                          

 

反射机制java官方给出的解释是: 在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法; 并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能成为Java语言的反射机制

    反射不知道为什么叫反射,那么有没有正射呢?有,我们平常创建类的对象时java会先获取到该类的信息,再创建对象,就是我们平常将类实例化,使用这个类的对象的操作,这个就可以说是正射;反射就是在编译时期java不知道该类的信息只有在运行时java才知道,一开始并不知道要创建的对象是什么,所以不能使用new来创建,java是通过一个叫class对象的玩意获取到类的信息的,class对象是什么?

每个类在创建类的时候,java都会为这个类创建一个class对象,里面包含着这个类的类型信息,

要理解Class对象,我们先来了解一下rtti吧。 rtti运行时类型识别,其作用是在运行时识别一个对象的类型和类的信息。

Java是如何让我们在运行时识别对象和类的信息的?主要有两种方式: 一种是传统的rtti,它假定我们在编译期已知道了所有类型。 另一种是反射机制,它允许我们在运行时发现和使用类的信息。

每个类都有一个Class对象,每当编译一个新类就产生一个Class对象(更恰当地说,是被保存在一个同名的.class文件中)。比如创建一个Student类,那么,JVM就会创建一个Student对应Class类的Class对象,该Class对象保存了Student类相关的类型信息

这个是refect对象的创建,再对比一下普通类的创建,在第一行就已经知道要实例化的类是什么。

下面是反射的底层实现,Method 的 invoke 方法,其实是返回接口MethodAccessor的invoke方法。MethodAccessor接口有三个实现类,到底调用的是哪个类的 invoke 方法呢?

进入acquireMethodAccessor方法,可以看到MethodAccessor由ReflectionFactory 的 newMethodAccessor方法决定。

再进ReflectionFactory的newMethodAccessor方法,我们可以看到返回的是DelegatingMethodAccessorImpl对象,也就是说调用的是它的invoke方法。

再看DelegatingMethodAccessorImpl的invoke方法

DelegatingMethodAccessorImpl的invoke方法返回的是MethodAccessorImpl的invoke方法,而MethodAccessorImpl的invoke方法,由它的子类NativeMethodAccessorImpl重写,这时候返回的是本地方法invoke0,如下

因此,Method的invoke方法,是由本地方法invoke0决定的,再底层就是c++相关了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值