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

news2024/9/19 2:44:31

目录

作用

应用场景 

案例需求

实现步骤

代码实现


作用

  • 基本作用:可以得到一个类的全部成分然后操作。
  • 可以破坏封装性。
  • 最重要的用途是:适合做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.coloradmin.cn/o/2055263.html

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

相关文章

Springboot+vue 建筑资质证书管理系统

建筑企业资证管理系统,简称证书管理软件,基于springbootvue开发,数据库采用mysql,。以建筑企业证书管理为核心,包含投证书管理、证书过期提醒,辅助建筑企业高效完成证书管理、人员信息、投标经营活动等管理…

全功能知识付费小程序源码系统 支持视频课程、音频课程、图文课程 附带代码包以及搭建部署教程

系统概述 “全功能知识付费小程序源码系统”是一款专为知识创作者、教育机构及企业内训部门设计的全方位解决方案。该系统基于当前最流行的小程序技术构建,无需下载安装,用户只需通过微信等社交平台即可轻松访问,极大地降低了使用门槛。同时…

CentOS 7 安装流程详细教程

目录 前言1. CentOS 7 概述2. 安装环境准备2.1 硬件要求2.2 安装介质准备 3. CentOS 7 安装步骤3.1 引导安装程序3.2 选择语言和键盘布局3.3 配置安装源和软件包3.4 配置分区3.5 设置网络和主机名3.6 设置时间和日期3.7 设置 root 密码和创建用户3.8 开始安装并完成配置 4. 安装…

8-11章节复习总结

文章目录 数据库技术三级模式两级映射数据设计数据模型E-R模型关系模型练习题 关系代数关系代数运算符练习题 SQL语句练习题 数据库控制练习题 数据库故障和备份函数依赖函数依赖的公理系统键与约束 规范化第一范式1NF第二范式2NF第三范式3NF练习题 模式分解练习题 标准化与知识…

R语言统计分析——回归诊断2

参考资料:R语言实战【第2版】 R语言的car包提供的大量函数,大大增强了拟合和评价回归模型的能力。如下: 函数目的qqPlot()分位数比较图durbinWatsonTest()对误差自相关性做Durbin-Watson检验crPlots()成分与残差图ncvTest()对非恒定的误差方…

如何构建Java SpringBoot+Vue的宽带业务管理系统:一步一脚印教程

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

贝叶斯推理:分步指南

一、说明 让我们深入了解贝叶斯推理的迷人世界。我将通过易于遵循的示例向您介绍其实际应用。 贝叶斯推理为统计分析提供了一个强大而灵活的框架,特别是在存在不确定性和先验知识的情况下。通过结合先前的分布并使用贝叶斯定理根据新证据更新这些信念,贝…

可视耳勺值不值得买?精心总结六大选购技巧

随着生活品质逐渐提高,很多家庭越来越关注个护健康,其中包括耳道的清洁方式。以前人们常用棉签或者挖耳勺进行掏耳朵,但这种方式很容易导致清洁不干净引发中耳炎。可视耳勺应运而生,能通过可视化的操作帮助用户看清耳垢位置进行精…

python之matplotlib (4 图例)

图例 方法一 import matplotlib.pyplot as plt import numpy as npxnp.arange(1,10) yx2 yy2*x1figplt.figure() axplt.gca() ax.plot(x,y,labela,ccoral) ax.plot(x,yy,labelb,cy) plt.legend() plt.show() 在plot中的参数label注明标注名称即可实现图例的绘制,但…

【深度学习】直观理解AUROC

文章目录 前言如何计算直观解释常用计算方式 前言 AUROC常用于衡量二分类分类器的性能,本文旨在详解该指标计算过程 如何计算 设想我们有一个分类器,对数据做二分类。我们设输入数据为 x x x, 预测标签为 y y y, ground-truth标签为 y ^ \hat{y} y…

JAVA多场景多项目排队叫号系统小程序源码

🔥【告别长龙,智能排队新风尚】多场景多项目排队叫号系统大揭秘🔍 🚀【一码在手,轻松畅游各大场景】 还在为医院挂号、银行办事、餐厅等号的长队头疼吗?😩 多场景多项目排队叫号系统&#xff0…

关于nginx标准配置参数介绍

标准配置参数: user root;#配置用户或者组,默认为nobody worker_processes 4;#允许生成的进程数,默认为1 项目中nginx.conf配置文件 user root; worker_processes 4; //最大的进程数,要看服务器的内核是多少核的&#xff0…

IEEE-802.3总线局域网

关于以太网相关基础知识,这批文章说的挺好的。

MacOS 阿里云docker镜像仓库无法登录的解决办法

问题情况 Error response from daemon: Get “https://registry.cn-hangzhou.aliyuncs.com/v2/”: Method Not Allowed 解决办法 MacOS下,打开该文件 open ~/.docker删除config.json文件 重新登录 已经提示Login Successed 接下去进行其他操作即可。 PS&…

MiDaS、ZoeDepth、Depth-Anything ai算法深度图估计

1、MiDaS 参考: https://github.com/isl-org/MiDaS https://pytorch.org/hub/intelisl_midas_v2/ https://colab.research.google.com/github/pytorch/pytorch.github.io/blob/master/assets/hub/intelisl_midas_v2.ipynb#scrollTo5A32CL3tocrZ 代码 import cv2 i…

如何使用midjourney?MidJourney订阅计划及国内订阅教程

国内如何订阅MidJourney 第三方代理 参考: zhangfeidezhu.com/?p474 使用信用卡订阅教程 办理国外信用卡: 这个各自找国外的银行办理就好了。 登录MidJourney: 登录MidJourney网站,进入订阅中心。如果是在Discord频道&#x…

idea启动报错Improperly specified VM option.

我本来是想解决idea启动占内存的问题,在网上找了个修改启动参数,这么改的 因为格式不正确,idea启动报错: Improperly specified VM option. To fix the problem, edit your JVM optionsand remove the options that are obsolete…

19 OptionMenu 组件

OptionMenu 组件使用指南 Tkinter 的 OptionMenu 组件是一个下拉选择框,允许用户从一组预定义的选项中选择一个。它通常用于提供用户一个有限的选项集合来选择。以下是对 OptionMenu 组件的详细说明和一个使用案例。 OptionMenu 组件属性 variable: 与 OptionMen…

一个开源可视化网页编辑器,为开发者提供一个快速构建 Web 应用的平台

大家好,今天给大家分享的是一款功能强大、灵活且开源的 可视化网页编辑器框架GrapesJS。它允许用户通过拖拽、点击等直观的方式,无需编写代码即可创建自定义的网页、邮件模板、仪表盘等 项目介绍 GrapesJS 是一个免费的开源 Web 构建器框架,…

常用FTP等工具配置

一、WINSCP 常用配置 1、配置putty:选项-应用程序-路径,记住会话密码传给PUTTY. 2、配置传输777权限:选项->传输->编辑->设置0777权限。 二、PUTTY 常用配置 1、putty 日志路径配置。logging-logfilename: D:/puttylog/&H-&a…