反射

反射

一、类的加载时机

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

  • 加载 :就是指将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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

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