复习第三章反射+IO流

news2024/9/21 19:27:40

一、反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
要想解剖一个类,必须先要获取到该类的字节码文件对象。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象.

1.1 反射的理解

Java 中 的 反 射 首 先 是 能 够 获 取 到 Java 中 要 反 射 类 的 字 节 码 , 获 取 字 节 码 有 三 种 方 法 :
1.Class.forName(className)
2.类名.class
3.this.getClass()

然后将字节码中的方法,变量,构造函数等映射成相应的 Method、Filed、Constructor 等类,这些类提供了丰富的方法可以被我们所使用。

1.2 反射的应用场景

在Java中,反射(Reflection)是指程序在运行时可以访问、检测和修改其自身状态或行为的能力。通过反射,可以在运行时动态地获取类的信息、调用类的方法、访问类的属性,并进行一些其他的操作。

反射的应用场景包括:

  1. 动态加载类:
    使用反射可以在运行时动态加载指定的类。通过 Class.forName() 方法或类加载器,可以根据类的全限定名动态加载类,并创建该类的实例。

  2. 获取类的信息:
    通过反射可以获取类的各种元数据信息,如类的名称、父类、接口实现、构造方法、字段、方法等。可以通过调用 getClass() 或 class 关键字获取某个对象的类信息。

  3. 创建实例对象:
    反射允许通过类的构造方法创建一个新的对象,即使没有直接访问类的构造方法。可以使用 Class 对象的 newInstance() 方法来创建类的实例对象。

  4. 调用方法:
    通过反射可以在运行时动态调用类的方法。可以使用 Method 对象的 invoke() 方法调用类的方法,并传递相应的参数。

  5. 获取和设置字段值:
    通过反射可以获取和设置类的字段的值。可以使用 Field 对象的 get() 和 set() 方法来访问和修改字段的值。

  6. 注解处理:
    通过反射可以在运行时检查和处理类和字段上的注解信息。可以使用 Annotation 对象和注解处理器来处理注解,实现自定义的逻辑。

反射在一些框架和工具库中被广泛使用,例如:

  1. Spring框架:
    使用反射实现了IoC(控制反转)和AOP(面向切面编程)的功能,通过动态加载类、调用方法和访问属性来实现依赖注入和切面编程。

  2. Hibernate ORM:Hibernate是一个ORM(对象关系映射)框架,它使用反射来实现对象和数据库之间的映射。通过使用注解或XML配置,Hibernate能够根据实体类的属性,动态生成和执行对应的SQL语句,从而将对象的状态持久化到数据库中。

  3. JUnit测试框架:JUnit测试框架使用反射来发现和执行测试方法。通过分析测试类中的注解和方法,JUnit能够动态地运行各个测试方法,收集结果并生成报告。

  4. JSON序列化和反序列化:许多JSON解析库(如Jackson、Gson)使用反射来在Java对象和JSON数据之间进行转换。通过分析Java对象的结构,这些库能够将对象属性映射为JSON键值对,或者根据JSON数据来创建相应的Java对象。

  5. 动态代理:反射可以用于实现动态代理模式。通过创建代理类和实现InvocationHandler接口,可以在运行时动态生成代理对象,从而进行一些额外的操作,如添加日志、权限校验等。

需要注意的是,尽管反射提供了灵活性和强大的能力,但由于其涉及到运行时的元数据操作,性能相对较低。因此,在使用反射时应谨慎考虑其影响,并尽量保证代码的可读性和性能的高效性。

二、IO流

2.1 IO流的划分

**按照流的方向:**输入流(inputStream)和输出流(outputStream)。

**按照实现功能分:**节点流(可以从或向一个特定的地方(节点)读写数据。如 FileReader)和处理流(是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。)

**按照处理数据的单位:**字节流和字符流。字节流继承于 InputStream 和 OutputStream,字符流继承于InputStreamReader 和 OutputStreamWriter。
在这里插入图片描述
在这里插入图片描述

2.2 字节流如何转为字符流

字节输入流转字符输入流通过 InputStreamReader 实现,该类的构造函数可以传入 InputStream 对象。
字节输出流转字符输出流通过 OutputStreamWriter 实现,该类的构造函数可以传入 OutputStream 对象。

2.3 字节流和字符流的区别

字节流读取的时候,读到一个字节就返回一个字节; 字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在 UTF-8 码表中是 3 个字节)时。先去查指定的编码表,将查到的字符返回。 字节流可以处理所有类型数据,如:图片,MP3,AVI 视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。字节流主要是操作 byte 类型数据,以 byte 数组为准,主要操作类就是 OutputStream、InputStream

字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。所以字符流是由 Java 虚拟机将字节转化为 2 个字节的Unicode 字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点。在程序中一个字符等于两个字节,java 提供了 Reader、Writer 两个专门操作字符流的类。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在使用Python爬虫时遇到503 Service Unavailable错误解决办法汇总

在进行Python爬虫的过程中,有时会遇到503 Service Unavailable错误,这意味着所请求的服务不可用,无法获取所需的数据。为了解决这个常见的问题,本文将提供一些解决办法,希望能提供实战价值,让爬虫任务顺利完…

机器人科普--AGILOX 叉车

机器人科普--AGILOX 叉车 1 概述2 导航3 驱动轮组4 叉举参考 1 概述 AGILOX 叉车,不需要画地图路径,很厉害。 2 导航 中间路径自由导航,末端规划出轨迹路线,并使用优良的控制器做轨迹追踪。 AGILOX | 10 Min setu…

mysql安装教程保姆级

MySQL免安装本地运行 1.下载MySQL2.创建install.bat3.init.sql 初始创建4.环境变量配置5.运行 install.bat 管理员权限运行6.连接成功遇到的问题 1.下载MySQL ①地址:https://downloads.mysql.com/archives/community/ ②解压 2.创建install.bat 放在mysql>b…

时序预测 | MATLAB实现GRNN广义回归神经网络时间序列预测(多指标,多图)

时序预测 | MATLAB实现GRNN广义回归神经网络时间序列预测(多指标,多图) 目录 时序预测 | MATLAB实现GRNN广义回归神经网络时间序列预测(多指标,多图)效果一览基本介绍程序设计参考资料效果一览 基本介绍 1.MATLAB实现GRNN广义回归神经网络时间序列预测(完整源码和数据) …

hive-date

current_date -- 获取当前系统时间 ,获取到的是10 的系统时间 例如 : 2023-07-28 select current_date form edw.test;current_timestamp -- 获取当前的时间戳日期格式,例如 1957-07-27 13:31:21.641 会取到毫秒的一个时间戳格式 select *…

openvino批量推理资料汇总

1、开发者实战 | 基于 C# 和 OpenVINO™ 2023.0部署 YOLOv8 全系列模型_OpenVINO 中文社区的博客-CSDN博客 2、在英特尔 CPU 上加速 Stable Diffusion 推理_OpenVINO 中文社区的博客-CSDN博客 3、 5周年更新 | OpenVINO™ 2023.0,让AI部署和加速更容易_OpenVINO 中…

【C++】—— 多态的基本介绍

前言: 在之前的学习过程中,我们已经对继承进行了详细的学习和了解。今天,我将带领大家学习的是关于 多态 的基本知识。 目录 (一)多态的概念 1、概念 (二)多态的定义及实现 1、多态的构成条…

【力扣每日一题】2023.8.1 英雄的力量

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们一个数组,让我们找出数组的每个非空子数组(不用连续),然后按照公式算出子数组的…

CNN、数据预处理、模型保存

目录 CNN代码读取数据搭建CNN训练网络模型 数据增强迁移学习图像识别策略数据读取定义数据预处理操作冻结resnet18的函数把模型输出层改成自己的设置哪些层需要训练设置优化器和损失函数训练开始训练再训练所有层关机了,再开机,加载训练好的模型 CNN 代码…

计算机网络(2) --- 网络套接字UDP

计算机网络(1) --- 网络介绍_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/131967378?spm1001.2014.3001.5501 目录 1.端口号 2.TCP与UDP协议 1.TCP协议介绍 1.TCP协议 2.UDP协议 3.理解 2.网络字节序 发送逻辑…

Node.js之express框架学习心得

Node.js:颠覆传统的服务器端开发 Node.js是基于Chrome V8引擎构建的JavaScript运行时,它采用了完全不同的开发模型。Node.js使用事件驱动和非阻塞I/O的方式处理请求,通过单线程和异步机制,实现高效的并发处理。这意味着在Node.js中,一个线程可以处理数千个并发连接,大大提…

Debian 12.1 “书虫 “发布,包含 89 个错误修复和 26 个安全更新

导读Debian 项目今天宣布,作为最新 Debian GNU/Linux 12 “书虫 “操作系统系列的首个 ISO 更新,Debian 12.1 正式发布并全面上市。 Debian 12.1 是在 Debian GNU/Linux 12 “书虫 “发布六周后推出的,目的是为那些希望在新硬件上部署操作系统…

从内核源码看 slab 内存池的创建初始化流程

slab cache 机制确实比较复杂,涉及到的场景又很多,大家读到这里,我想肯定会好奇或者怀疑笔者在上篇文章中所论述的那些原理的正确性,毕竟 talk is cheap ,所以为了让大家看着安心,理解起来放心,…

让SpringBoot不需要Controller、Service、DAO、Mapper,卧槽!这款工具绝了!

Dataway介绍 Dataway 是基于 DataQL 服务聚合能力,为应用提供的一个接口配置工具。使得使用者无需开发任何代码就配置一个满足需求的接口。整个接口配置、测试、冒烟、发布。一站式都通过 Dataway 提供的 UI 界面完成。UI 会以 Jar 包方式提供并集成到应用中并和应…

在windows下安装ruby使用gem

在windows下安装ruby使用gem 1.下载安装ruby环境2.使用gem3.gem换源 1.下载安装ruby环境 ruby下载地址 选择合适的版本进行下载和安装: 在安装的时候,请勾选Add Ruby executables to your PATH这个选项,添加环境变量: 安装Ruby成…

vue-print-nb使用(实现分页打印)

参考链接&#xff1a;vue-print-nb - npm (npmjs.com)https://www.npmjs.com/package/vue-print-nb 一、安装 1、Vue2安装 npm install vue-print-nb --save <!-- 全局配置&#xff1a;main.js --> import Print from vue-print-nb // Global instruction Vue.use(P…

解码“平台工程”,VMware 有备而来

随着全球数字化进程加快&#xff0c;企业使用前沿技术加快商业创新&#xff0c;以提高竞争力。其中如何加快开发效率&#xff0c;为客户创造更多价值成为新的关注焦点。 继DevOps后&#xff0c;“平台工程”&#xff08;Platform Engineering&#xff09; 一词引发热议。平台工…

Redis的安装部署以及基本的使用

目录 一、Linux下直接安装Redis &#xff08;1&#xff09;下载Redis安装包 &#xff08;2&#xff09;安装GCC编译环境 &#xff08;3&#xff09;安装Redis &#xff08;4&#xff09;服务启动 &#xff08;5&#xff09;后台启动 二、使用Docker安装部署Redis &…

火车头采集器免费版【php源码】

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python turtle circle 画半圆圆心在哪&#xff0c;python中用turtle画一个圆形&#xff0c;现在让我们一起来看看吧&#xff01; 1、t.circle(100,180)的意思&#xff1f; t.circle(100, 180)是Python中turtle库中的一…