反射

反射

一、类的加载时机

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

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

相关推荐

  • 极大似然估计的意义_极大似然估计原理思想

    极大似然估计的意义_极大似然估计原理思想极大似然估计是概率论中一个很常用的估计方法,在机器学习中的逻辑回归中就是基于它计算的损失函数,因此还是很有必要复习一下它的相关概念的。背景先来看看几个小例子:猎人师傅和徒弟一同去打猎,遇到一只兔

  • 利用Regsvr32绕过Applocker的限制策略

    利用Regsvr32绕过Applocker的限制策略

  • 仿照博客园搜索功能 找找看的实现 发现问题 杂谈

    仿照博客园搜索功能 找找看的实现 发现问题 杂谈

  • java与c语言哪个好学_Java编程和C语言哪个好学「建议收藏」

    java与c语言哪个好学_Java编程和C语言哪个好学「建议收藏」原标题:Java编程和C语言哪个好学学哪种编程语言好?计算机编程语言非常多,诸如Java、C、C++、PHP等,很多人在选择的时候都会觉得头大。到底学哪种编程语言好?很多人都拿Java和c相比较,那么今天小编就来先说说我的个人理解吧,学习Java很简单上手很容易,只需要会拼音就可以,简直而且没有门槛,而c语言学习成本高,要想学会需要投入较大的精力,才能有一个相对不错的回报。下面是Java和c的市…

  • 【游戏】光棍节程序员闯关秀过关攻略「建议收藏」

    【游戏】光棍节程序员闯关秀过关攻略「建议收藏」光棍节,与我无关,结果昨夜下了场雨,导致路面结冰,大侠的出行计划泡汤了,只好在家淘宝抢东西。结果网友发来一个光棍节程序员闯关秀游戏,让大侠一发不可收拾。。。游戏地址http://segmentfault.com/game/花了两个小时过了9关,最后一关没过去。欢迎大家补充。第一关:本关用右键查看URL就能得到地址,大侠用的GoogleChrome,查看元素,下面的也基本用这个浏

  • vs tfs使用_win10安装vs2010不兼容

    vs tfs使用_win10安装vs2010不兼容一直是用vss的,最近突然看到,原来已经流行用vsts了(版本管理等服务用tfs)。太落伍了。故决定自己在个人电脑上安装vsts。首先在MSDN上看到,tfs2008以前要装在service系统上面,我没有,也不想去装。后来看到tfs2010几乎支持所有windows系统。故决定用现有的vs2008+tfs2010搭配。            ok,vs2008已有,打补丁sp1,下

发表回复

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

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