反射

反射

一、类的加载时机

当程序要使用某个类时,如果该类还未被加载到内存中,系统会通过加载,连接,初始化三步来实现对这个类进行初始化。

  • 加载 :就是指将class文件读入内存,并为之创建一个Class对象。任何类被使用时系统都会建立一个Class对象。

  • 连接:验证 是否有正确的内部结构,并和其他类协调一致。准备 负责为类的静态成员分配内存,并设置默认初始化值。

  • 初始化:初始化成员变量等等。

加载时机

  1. 创建类的实例
  2. 访问类的静态变量,或者为静态变量赋值
  3. 调用类的静态方法
  4. 初始化某个类的子类
  5. 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象

二、类加载器

什么是类加载器classLoader

负责将.class文件加载到内存中,并为之生成对应的Class对象。

虽然我们不需要关心类加载机制,但是了解这个机制我们就能更好的理解程序的运行。

类加载器分类

根类加载器

  • 也被称为引导类加载器,负责Java核心类的加载
  • 比如System,String等。在JDK中JRE的lib目录下rt.jar文件中

扩展类加载器

  • 负责JRE的扩展目录中jar包的加载。
  • 在JDK中JRE的lib目录下ext目录

系统类加载器

  • 负责在JVM启动时加载来自java命令的class文件
  • 以及classpath环境变量所指定的jar包和类路径

三、什么是反射

创建一个对象的三个阶段

  1. 源文件阶段 .java的文件
  2. 字节码阶段 .class
  3. 创建对象阶段 new 对象名称

内省

在运行时能够获取JavaBean当中的属性名称和get与set方法

反射

  • JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法

  • 对于任意一个对象,都能够调用它的任意一个方法和属性;

  • 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

  • 想要使用反射,就必须得要获取字节码文件。

获取字节码文件

1. Object类的getClass()方法

判断两个对象是否是同一个字节码文件

2. 静态属性class

当作静态方法的锁对象

3. Class类中静态方法forName()

读取配置文件

示例

1472533-20190331211538150-434399523.png

四、通过字节码创建对象

1. 通过无参构造创建对象

  1. 获取字节码
  2. 调用字节码的newInstance()方法

1472533-20190331213208302-1011444960.png

2. 通过有参构造创建对象

  1. 获取字节码的构造器
    1. clazz.getConstructor(type.class)
    2. 因为在反射阶段操作的都是字节码,不知道具体的类型,只有在创建对象的时候才去给实际参数
  2. 通过构造器创建对象
    1. 调用构造器的newInstance方法并传入参数

1472533-20190331213215006-1192633024.png

五、获取字段

1. 获取公共的字段

直接调用 clazz.getField(“字段名称”)

1472533-20190331221015811-1903089348.png

2. 获取私有的字段

  • 使用暴力反射
  • clazz.getDeclardField(“字段名称”)
  • 去除私有的权限
  • 再进行调用

1472533-20190331221021932-1268962589.png

六、获取方法

使用getDeclaredMethod(“方法名称”,”参数类型字节码”)

1472533-20190331221045666-1959135398.png

七、越过数组泛型检测

数组如果定义好了泛型就不能添加泛型以外的类型。

但是可以通过反射来去实现添加以外的类型。

在一个Integer泛型的数组当中添加字符串类型,实现代码:

1472533-20190331223411893-1280004287.png

八、Servlet创建过程原理

  • Servlet内部就是通过读取web.xml当中
  • 配置的类的全路径
  • 根据全路径找到对应的字节码
  • 获取字节码之后
  • 通过反射进行创建对象
  • 调用对应的方法

模拟实现代码:

1472533-20190331223416236-1645549506.png

转载于:https://www.cnblogs.com/xzh0717/p/10633228.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101011.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 状态模式「建议收藏」

    状态模式「建议收藏」状态模式

    2022年4月21日
    49
  • 美化QTabWidget[通俗易懂]

    美化QTabWidget[通俗易懂]美化QTabWidget1.效果展示2.用法展示MainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(newUi::MainWindow){ui->setupUi(this);setupUI();ui->tabWidget->addTab2(newQWidget(),tr(“thisisfirsttab”));}MainWindo

    2022年9月24日
    0
  • js正则 手机号_正则表达式 手机号

    js正则 手机号_正则表达式 手机号RegExp对象正则表达式是描述字符模式的对象。正则表达式用于对字符串模式匹配及检索替换,是对字符串执行模式匹配的强大工具。//匹配手机号//varres=/^[1][3,4,5,6.7,8,9][0-9]{9}$///letnum=18045216903//console.log(res.test(num))//匹配身份证号码//varres=/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)///varn=’5203

    2022年9月14日
    0
  • ettercap 图形界面遇无线网卡报错[通俗易懂]

    ettercap 图形界面遇无线网卡报错[通俗易懂]ettercap0.8.2copyright2001-2015EttercapDevelopmentTeamERROR:9,错误的文件描述符[/build/ettercap-W54WVV/ettercap-0.8.2/src/ec_network.c:source_init:245]libnet_init:unknownphysicallayertype0…

    2022年6月28日
    27
  • pycharm2019.3.3激活教程_pycharm2020.2激活码

    pycharm2019.3.3激活教程_pycharm2020.2激活码下载官网下载2019.03最新版http://www.jetbrains.com/pycharm/download/download-thanks.html?platform=windows安装一路点击下一步,安装目录建议放在非C盘位置激活方式1:激活码第一次打开时,激活方式选择激活码。复制粘贴下面一整行,点击激活即可。有效期是2019年11月份,到时候会更新新的激活码。这种方式…

    2022年8月25日
    3
  • Dreamweaver8的安装

    Dreamweaver8的安装安装步骤:Step1:双击<Dreamweaver8-chs>Step2:单击<下一步>Step3:选中<我接受该许可证协议中的条款>,单击<下一步>按钮Step4:选中<在桌面上创建快捷方式(针对所有用户)>,单击<下一步>Step5:单击<下一步>S…

    2022年7月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号