反射

反射

一、类的加载时机

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

  • 加载 :就是指将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)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • ecshop有哪些bug_ecshop二次优化

    ecshop有哪些bug_ecshop二次优化ECshop后台显示Deprecated:Assigningthereturnvalueofnewbyreferenceisdeprecatedinadmin\goods_batch.phponline921最近在做一个网店的项目,用ECshop开发,装在window7下,后台管理出现了( ! ) Deprecated: Assigning th

    2022年11月1日
  • Linux查看redis版本(查看mongodb版本)

    快半年没有在Linux中使用redis了,命令有些生疏了,网上很多博文也不对,不知道博主是否直接复制的来的。以下为重新整理资料,便于忘记时候复习首先进入cd/usr/local目录不用说了我把redis安装到了redis文件夹中了,在bin目录下找到redis-server使用./redis-server–version查看版本信息[red@RedFaceloc…

    2022年4月16日
  • 渲染画(笑脸怎么画)

    @TOC目录开始学习ShaderToy,往往不知所措,看不太懂;不容易懂,背后全是数学公式;请看这篇了解一下原理和基础。实践方法:请打开网站https://www.shadertoy.com,点击新建开始实验。完成一个圆的渲染首先把下列代码贴入voidmainImage(outvec4fragColor,invec2fragCoord){vec2uv=…

    2022年4月16日
  • 动态规划-背包问题

    动态规划-背包问题背包问题是一种组合优化的NP完全问题。有N个物品和容量为W的背包,每个物品都有自己的体积w和价值v,求拿哪些物品可以使得背包所装下的物品的总价值最大。如果限定每种物品只能选择0个或1个,则问题称为0-1背包问题;如果不限定wu’pi…

    2022年7月26日
  • DSP效果器调音教程_DSP控制器

    DSP效果器调音教程_DSP控制器1)DSP输出给5V的电路(如D/A),无需加任何缓冲电路,可以直接连接。3)的JTAG口的信号也必须为3.3V,否则有可能损坏DSP。dsp教程24。为什么要片内RAM大的DSP效率高?目前DSP发展的片内存储器RAM越来越大,要设计高效的DSP系统,就应该选择片内RAM较大的DSP。片内RAM同片外存储器相比,有以下优点:1)片内RAM的速度较快,可以保证DSP无等待运行。2)对于C2000…

    2022年9月3日
  • 计算机网络重点回顾

    计算机网络一.计算机网络概述计算机网络的概念:(*)1.计算机网络的定义:​ 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路链接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。2.计算机网络的组成:终端系统/资源子网:提供共享的软件资源和硬件资源通信子网:提供信息交换的网络结点和通信线路。3.计算机网络的类型:按照拓朴分类:星型结构树形结构总线型结构环形结构网状结构按照范围分

    2022年4月9日

发表回复

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

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