Java——反射(4/4):反射的作用、应用场景(案例需求、实现步骤、代码实现)

目录

作用

应用场景 

案例需求

实现步骤

代码实现


作用

  • 基本作用:可以得到一个类的全部成分然后操作。
  • 可以破坏封装性。
  • 最重要的用途是:适合做Java的框架,基本上,主流的框架都会基于反射设计出一些通用的功能。

通过反射能够获取到一个类的全部成分,包括其属性、方法、构造函数等。这意味着可以在运行时动态地了解和操作类的结构和行为。

说它能破坏封装性,是因为正常情况下,类的私有成员是不应该被外部直接访问和操作的,但反射却提供了一种途径能够绕过这种限制

其最重要的用途在于适合构建 Java 框架。例如,许多主流框架利用反射来实现通用功能。比如,框架可以通过反射自动为对象进行属性赋值、调用对象的方法,或者根据配置动态地创建类的实例等。这样就大大提高了框架的灵活性和通用性,开发者在使用框架时能够更方便地进行定制和扩展。

应用场景 

案例需求

使用反射做一个简易版的框架

  • 需求:对于任意一个对象,该框架都可以把对象的字段名和对应的值,保存到文件中去。

对于这个案例,如果不使用框架,对于每个不同的对象,都需要手动编写代码来获取其字段名和对应的值,并将其保存到文件中。这样会导致代码重复且不灵活,难以应对大量不同类型的对象。而使用反射构建的框架,可以以一种通用的方式处理任意对象,提高了代码的复用性和可维护性。

实现步骤

  1. 定义一个方法,可以接收任意对象。
  2. 每收到一个对象后,使用反射获取该对象的class对象,然后获取全部的成员变量。
  3. 遍历成员变量,然后提取成员变量在该对象中的具体值。
  4. 把成员变量名、和其值,写出到文件中去即可。

代码实现

import java.io.FileOutputStream;
import java.io.PrintStream;
import java.lang.reflect.Field;public class ObjectFrame{//目标:保存任意对象的字段和其数据到文件中去public static void saveObject(Object obj) throws Exception{PrintStream ps = new PrintStream(new FileOutputStream("src/user/reflectTest/data.txt",true));//obj是任意对象Class c = obj.getClass();//可以先拿出简易名字String cName = c.getSimpleName();ps.println("---------------" + cName + "---------------");//2.从这个类中提取它的全部成员变量Field[] fields = c.getDeclaredFields();//3.遍历每个成员变量for(Field field:fields){//4.拿到成员变量的名字String name = field.getName();//5.拿到这个成员变量在对象中的数据。field.setAccessible(true);  //禁止检查访问权限String value = field.get(obj) + "";//写入文件ps.println(name + " = " + value);}//记得关闭流ps.close();}
}

随便拿两个类出来创建对象

运行之后查看data.txt文件:


END 


学习自:黑马程序员——Java课程

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

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

相关文章

JVisualVM 基础知识与配置详解(图文界面)

目录 前言1. 基本知识2. 下载配置3. 测试 前言 对于Java的基本知识,推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理(持续更新) 1. 基本知识 …

[Meachines] [Easy] Bastion SMB未授权访问+VHD虚拟硬盘挂载+注册表获取NTLM哈希+mRemoteNG远程管理工具权限提升

信息收集 IP AddressOpening Ports10.10.10.134TCP:22, 135, 139, 445, 5985, 47001, 49664, 49665, 49666, 49667, 49668, 49669, 49670 $ nmap -p- 10.10.10.134 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH fo…

multimodel ocr dataset

InternLM-XComposer2-4KHD InternLM-XComposer2-4KHD a light-weight Vision Encoder OpenAI ViT-Large/14Large Language Model InternLM2-7B, 这篇论文采用的是一种动态分辨率的输入; 全图有一个global view,resize到336*336; 然后把图片resize再pad…

Kubernetes群集部署

Kubernetes概述 是一个开源的Docker容器编排技术 源自于google的borg2015年7月kubernetesv1.0正式发布调度计算集群节点,动态管理节点上的作业使用[labels]和[pods]概念,将应用按逻辑单元分组 主要用途 自动化部署、扩展和管理容器应用资源调度部署管理…

计算机毕业设计pyspark+django+scrapy租房推荐系统 租房大屏可视化 租房爬虫 hadoop 58同城租房爬虫 房源推荐系统

用到的技术: 1. python 2. django后端框架 3. django-simpleui,Django后台 4. vue前端 5. element-plus,vue的前端组件库 6. echarts前端可视化库 7. scrapy爬虫框架 基于大数据的租房信息推荐系统包括以下功能&#xff1a…

Windows下串口编程与单片机串口设备通信(win32-API)

一、前言 串行通信接口,通常简称为“串口”,是一种数据传输方式,其中信息以连续的比特流形式发送,每个比特在不同的时间点被传输。这与并行通信形成对比,在并行通信中,多个比特同时通过多个线路传输。串口…

学习笔记 韩顺平 零基础30天学会Java(2024.8.15)

P512 ArrayList底层源码2 P513 Vector注意事项 最近有点懈怠,要去新的环境上学了,有点焦虑,调整状态ing,准备开始研一,希望能继续本科的荣耀!! PS:本科应该算是荣耀的吧哈哈哈哈哈

html 首行缩进2字符

1. html 首行缩进2字符 1.1. 场景 在Html开发中让一段文字(富文本等)首行缩进两个文字,可能在前面加上8个“ ”,因为过去对CSS不熟悉,这种方法实现虽然比较直接,但是文字多的时候会有很多“ ”充斥在代码中…

深度学习设计模式之外观模式

文章目录 前言一、介绍二、特点三、详细分析1.核心组成2.代码示例3.优缺点优点缺点 4.使用场景 总结 前言 外观模式是结构型设计模式,定义一个高层接口,用来访问子系统中的众多接口,使系统更加容易使用。 一、介绍 外观设计模式&#xff08…

机器学习第十二章-计算学习理论

目录 12.1基础知识 12.2 PAC学习 12.3有限假设空间 12.3.1可分情形 12.3.2不可分情形 12.4VC维 12.5 Rademacher复杂度 12.1基础知识 计算学习理论研究的是关于通过"计算"来进行"学习"的理论,即关于机器学习的理论基础,其目的…

encoding with ‘idna‘ codec failed (UnicodeError: label empty or too long)

今天在使用Flask连接mysql的时候,遇到了一个报错:encoding with ‘idna’ codec failed (UnicodeError: label empty or too long) 网上查了一下说是字符集的问题,然后尝试修改了一下字符集,结果还是不行。 最后去翻阅SQLAlchemy…

汇昌联信科技做拼多多电商有哪些策略?

在当今竞争激烈的电商平台上,汇昌联信科技以其独到的策略成功立足拼多多。他们不仅凭借对市场的深刻理解,还通过一系列创新举措,实现了品牌的快速成长和市场份额的不断扩大。接下来,我们将深入探讨汇昌联信科技在拼多多平台上所采…

Python爬虫案例一:获取古诗文并按用户输入的作者名进行数据保存

前言: 1、什么是爬虫?也称为网页蜘蛛(Web Spider),通俗来说,解放人的双手, 去互联网获取数据, 以数据库, txt, excel, csv, pdf, 压缩文件, image, video, music保存数据。本质: 模拟浏览器, 向服务器发送…

高性能 Web 服务器:让网页瞬间绽放的魔法引擎(上)

目录 一.Apache介绍 1.Apache prefork 模型 2.Apache worker 模型 3.Apache event模型 二.Nginx介绍 1.什么是Nginx 2.Nginx 功能介绍 3.Nginx基础特性 4.Nginx 进程结构:web请求处理机制 5.主进程(master process)的功能: 6.工作进程&#x…

k8s基础概念以及部署

kubernetes基础概念 来历 kubernetes以谷歌borg为前身,基于谷歌15年生产环境经验开源的一个项目。k8s是一个开源,的分布式的容器编排技术。 k8s的优势 对比对象 裸容器 例如docker,直接将容器部署在宿主机的方式被称为裸容器。 缺点 纯粹的裸…

使用docker-compose运行kafka及验证(无需zookpeer)

前言:要求安装docker-compose kafka镜像版本:apache/kafka:3.8.0 可能存在镜像拉不下来的情况: 1、vim /etc/docker/daemon.json {"data-root":"/data/docker","registry-mirrors": ["https://docker.m…

【C++二分查找】875. 爱吃香蕉的珂珂

本文涉及的基础知识点 C二分查找 LeetCode875. 爱吃香蕉的珂珂 珂珂喜欢吃香蕉。这里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 h 小时后回来。 珂珂可以决定她吃香蕉的速度 k (单位:根/小时)…

Golang基于DTM的分布式事务SAGA实战

SAGA介绍 SAGA是“长时间事务”运作效率的方法,大致思路是把一个大事务分解为可以交错运行的一系列子事务的集合。原本提出 SAGA 的目的,是为了避免大事务长时间锁定数据库的资源,后来才逐渐发展成将一个分布式环境中的大事务,分…

The Sandbox 新提案: 2024 年亚洲和拉丁美洲区块链活动预算

理事会建议: 积极 🙂 内容 此提案请求为2024年第四季度,The Sandbox 在东南亚和拉丁美洲的主要区块链活动中的激活分配 94,500 美元的 SAND 倡议预算。(具体活动列表见下方活动描述) 原因 区域团队希望在这些现场活…

一文学会本地部署可视化应用JSONCrack并配置公网地址实现远程协作

文章目录 前言1. Docker安装JSONCrack2. 安装Cpolar内网穿透工具3. 配置JSON Crack界面公网地址4. 远程访问 JSONCrack 界面5. 固定 JSONCrack公网地址 前言 本文主要介绍如何在Linux环境使用Docker安装数据可视化工具JSONCrack,并结合cpolar内网穿透工具实现团队在…