Java基础-学习笔记18

news/2024/11/19 8:44:03/文章来源:https://www.cnblogs.com/97gogo/p/18429543

18 反射

1. 反射机制

  • 反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息(比如成员变量、构造器、成员方法等等),并能操作对象的属性及方法。反射在设计模式和框架底层都会用到;

  • 加载完类之后,在堆中就产生了一个 Class 类型的对象(一个类只有一个 Class 对象),这个对象包含了类的完整结构信息。通过这个对象得到类的结构,这个Class对象就像一面镜子,透过这个镜子看到类的结构,所以,形象地称之为:反射

  • Java反射机制原理示意图

  1. 类编译阶段(代码阶段)【JVM底层】
    通过Javac编译后,会生成对应的字节码文件,包含其属性、方法等等信息
  1. 类加载阶段(Class类阶段)【JVM底层】
    当运行阶段,创建了一个对象(new)时,会导致类的加载。此时会把编译阶段的字节码文件加载到内存的堆里,生成一个Class类对象,在堆里。包含成员变量、构造器、成员方法等等其它信息。
    在这个过程中,字节码文件如何生成Class对象并且放在堆里呢?是通过类的加载器(ClassLoader)完成的,这个过程其实就体现了反射机制。
    在堆里生成的Class对象,其实是个数据结构,在底层,会把成员变量映射成,或者说当作一个对象来看待。比如说成员变量会对应成一个数组 Field[] fields,构造器也会当成一种对象,这个对象的类型就是 Constructor,可能有多个构造器,所以也会映射成数组,成员方法等等类似。
  1. 运行阶段【应用】
    new一个对象,进行类加载过后会生成这个对象,这个对象也在堆中,该对象能知道自己属于哪个Class对象。
    得到Class对象后,就可以创建对象,调用对象方法,操作属性等等。
  • Java反射机制可以完成:
  1. 在运行时判断任意一个对象所属的类
  2. 在运行时构造任意一个类的对象
  3. 在运行时德奥任意一个类所具有的成员变量和方法
  4. 在运行时调用任意一个对象的成员变量和方法
  5. 生成动态代理
  • 反射相关的主要类

  • 反射的优缺点:
    优点: 可以多态的创建和使用对象(也是框架底层核心),灵活使用,没有反射机制,框架技术就失去底层支撑。
    缺点:使用反射基本是解释执行,堆执行速度有影响。

  • 反射调用优化——关闭访问检查

  1. Method 和 Field、Constructor 对象都有 setAccessible()方法
  2. setAccessible 作用是启动和禁用访问安全检查的开关
  3. 参数值为 true 表示 反射的对象在使用时取消访问检查,提高反射的效率。参数值为 false则表示反射的对象执行访问检查

2. Class类

  1. Class也是类,因此也继承 Object类
  2. Class类对象不是 new出来的,而是系统创建的(Class类对象是通过类加载器生成的,具体是loadClass方法完成类加载,然后生成某个类对应的Class对象)
  3. 对于某个类的Class类对象,在内存中只有一份,因为类只加载一次
  4. 每个类的实例都会记得自己是由哪个Class实例所生成
  5. 通过Class对象可以完整地得到一个类的完整结构,通过一系列API
  6. Class对象是存放在堆的
    7.类的字节码二进制数据,是放在方法区的,有的地方称为类的元数据(包括 方法代码,变量名,方法名,访问权限等等)
  • Class类的常用方法

  • 获取 Class类对象

  • 如下类型有Class对象

3. 类加载

3.1 基本说明

反射机制是Java实现动态语言的关键,也就是通过反射实现类动态加载

  1. 静态加载:编译时加载相关的类,如果没有则报错,依赖性太强
  2. 动态加载:运行时加载需要的类,如果运行时不用该类,即使不存在该类,则不报错,降低了依赖性

3.2 类加载时机

  1. 当创建对象(new)时;静态加载
  2. 当子类被加载时,父类也加载;静态加载
  3. 调用类中的静态成员时;静态加载
  4. 通过反射;动态加载

3.3 类加载过程图

3.4 类加载各阶段完成任务

3.4.1 加载阶段

3.4.2 连接阶段-验证

3.4.3 连接阶段-准备

3.4.4 连接阶段-解析

3.4.5 初始化Initialization

4. 反射获取类的结构信息

  • 通过反射获取类的结构信息

  • 通过反射创建对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/804107.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ECU电控软件开发及测试介绍

本文重点介绍符合AutoSar架构的应用软件开发、MBD开发模式下的软件质量评估与优化方案、复杂场景下的ECU性能压力测试方案。 伴随着电动化、智能化、网联化等技术发展的时代背景,各行各业电子电气架构都在发生深度变革。新型架构逐渐取代传统架构,比如汽车、工程机械、…

BladeX开发入门(记录)

BladeX 物联网平台是一款高度集成的物联网解决方案,涵盖设备管理、数据采集、实时监控、数据分析以及开放API服务等核心功能。 平台经过精心设计与开发,提供了全面的品类、产品和设备支持。设备注册成功后,能够轻松桥接至其他物联网云平台,实现设备的无缝集成。 同时提供服…

RabbitMq 入门应用 提升性能 : 算法多阶段并行 (Python)

大问题: 我们有一个算法,它可以被分为多个阶段进行(顺序不可颠倒),每个阶段的性能和资源要求不同(且不均衡程度比较高); 假设我们现在可以堆资源(较多的CPU和内存),如何将算法各个步骤拆分并进行性能均衡和实现,使得算法性能最大化以满足生产要求? 多进程: 由于算法有严…

Github使用技巧

1、怎么查找对应关系 一般查找对应关系,可以去阅读下面的说明: 2、0.20.Release版本不存在的问题如上图:根本不知道0.2.1.RELEASE对应的dubbo-spring-boot-start版本是多少,在maven仓库中根本没有这个版本 解释:这里需要我们点击这个版本,然后就会跳转到这个代码上,如…

微信小程序修改radio颜色

看效果: 代码:<radio-group @change="onRadioChange"><label><radio value="同意" style="margin-right: 30rpx">同意</radio></label><label><radio value="不同意">不同意</radio&g…

springboot对接dubbo遇到的巨坑

1、添加配置jar包<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.7.4.1</version></dependency><dependency><groupId>org.apache.dubbo</gr…

一款高性价比4g工业路由器,配置简单,网络覆盖强

​各位老铁,今天给大家介绍一下SR600这款工业级4G路由器。这玩意儿是专门为工业环境设计的,比如说化工厂、矿场这种恶劣环境,普通路由器根本扛不住。先说说SR600的硬件配置:处理器: 工业级CPU,厂家没透露具体型号,但性能够用内存: 128MB,满足工业控制需求存储: 16MB Flash,可扩…

VS Code 的SSH连接不成功问题分析与解决

问题描述:多次输入密码,一直连接不上 解决方法; 打开远程服务器中~/.vscode-server/bin/xxx文件夹,此时可以看到一个名为vscode-server.tar.gz,截图如下:上面的37开头的文件夹称为Commit Id,现在利用Commit ID下载远程连接需要的文件。使用这个链接: https://update.cod…

「FJWC2020Day5-zzq」rng 题解

题意简述 一个长度为 \(n\) 的实数序列 \(a_i\),其中 \(a_i\) 为 \([l_i, r_i]\) 中独立均匀随机选取的实数。你只能通过交换相邻两个数,使得 \(a_i\) 单调不降。你需要求出你最少操作次数的期望,对 \(M = 998244353\) 取模。 \(1 \leq n \leq 10^6\),\(0 \leq l_i \lt r_i…

wpf ToggleButton选中效果和一个登录界面

先看效果 我修改了ToggleButton的ControlTemplate,在ContentPresenter外面加了4个Border,控制4个Border的位置在ControlTemplate的左上、右上、左下、右下,选中时,触发4个边框的BorderThickness <Setter Property="BorderThickness&qu…

WindowSystemEvent

Qt中为WindowSystemEvent事件定义了处理函数Handler,通过宏定义和模版来声明定义 ---- QT_DEFINE_QPA_EVENT_HANDLER Matches (25 in 1 files) ---- qwindowsysteminterface.cpp (gui\kernel) line 199 : #define QT_DEFINE_QPA_EVENT_HANDLER(ReturnType, HandlerName, ...) …

基础数据结构之递归

递归 1) 概述 定义 计算机科学中,递归是一种解决计算问题的方法,其中解决方案取决于同一类问题的更小子集In computer science, recursion is a method of solving a computational problem where the solution depends on solutions to smaller instances of the same probl…