【JAVA反射】

本文深入探讨了Java反射的概念,介绍了如何通过Class对象获取类的结构信息,并详细阐述了反射的实现原理,包括无参构造函数和有参构造函数的实例化过程,以及方法的调用方法。同时,讲解了获取Class对象的三种方式,强调了Object类中的getClass方法的重要性。
摘要由CSDN通过智能技术生成

反射
概念:在Java虚拟机中,加载类之后,会生成Class(字节码)文件,该对象包括了类的完整结构信息,通过这个Class对象可以看到类的所有结构,称之反射
作用:Java反射是在动态的获取类, 类属性, 类方法, 类构造器等内部一些类的信息
获取Class对象的三种方式
1、 Object ——> getClass();
2 、任何数据类型(包括基本数据类型)都有一个“静态”的class属性
3 、通过Class类的静态方法:forName(String  className)(常用)
其中1、是因为Object类中的getClass方法、因为所有类都继承Object类。从而调用Object类来获取
反射实现原理
第一步:首先调用了 java.lang.Class 的静态方法,获取类信息
主要是先获取 ClassLoader, 然后调用 native方法,获取信息。
class类信息获取到之后开始实例化,有两种(一:无参构造函数,二:有参构造函数)
第二步(无参构造函数): 调用 newInstance() 的实现方式
权限检测,如果不通过直接抛出异常;
查找无参构造器,并将其缓存起来;
调用具体方法的无参构造方法,生成实例并返回
第二步(有参构造函数):获取所有的构造器主要步骤
先尝试从缓存中获取
如果缓存没有,则从jvm中重新获取,并存入缓存,缓存使用软引用进行保存,保证内存可用
jvm获取 — getConstructor0() 为获取匹配的构造方器
先获取所有的constructors, 然后通过进行参数类型比较
找到匹配后,通过 ReflectionFactory copy一份constructor返回
否则抛出 NoSuchMethodException;
方法调用:
第一步,先获取 Method
获取所有方法列表(获取所有构造器的方法很相似,都是先从缓存中获取方法,如果没有,则从jvm中获取)
根据方法名称和方法列表,选出符合要求的方法

如果没有找到相应方法,抛出异常,否则返回对应方法
第二步,根据方法名和参数类型过滤指定方法返回(最优匹配或者精准匹配)
第三步,调用 method.invoke() 方法
跟踪底层源码发现Method的invoke方法,是由本地方法invoke0决定的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值