重写toString()方法-课后程序(JAVA基础案例教程-黑马程序员编著-第十二章-课后作业)

news2024/11/14 10:34:56

【案例12-1】:重写toString()方法

【案例介绍】

1.案例描述

为了方便输出对象,Object类提供了toString()方法。但是该方法的默认值是由类名和哈希码组成的,实用性并不强。通常需要重写该方法以提供更多的对象信息。

本案例要求使用反射重写类的toString()方法,并通过反射输出类的包名、类名、类的公共构造方法、类的公共域和类的公共方法。

2.运行结果

 

运行结果

【案例分析】

(1)通过任务的描述可知,此程序需要利用反射重写toString()方法,因此,需要先创建一个类,并在该类中定义两个方法,一个是toString()方法,用于输出类的包、类的名字、类的公共构造方法、类的公共域和类的公共方法等信息;另一个是main()方法,用来进行测试。

(2)由于是重写Object类的toString()方法,因此需要给toString()方法传递一个Object对象。

(3)由于需要利用反射输出类的包、类的名字、类的公共构造方法、类的公共域和类的公共方法,故需要先通过Object对象.getClass()获得代表该类的Class对象,再通过类的Class对象. getPackage()获得类所在的包,通过类的Class对象.getSimpleName()获得类的简单名称,通过类的Class对象.getDeclaredConstructors()获得所有代表构造方法的Constructor数组,遍历数组,判断如果是访问控制符为“public”即为公共构造方法。通过类的Class对象.getDeclaredFields()获得代表所有域的Field数组,遍历数组,判断如果是访问控制符为“public”即为公共域。通过类的Class对象.getDeclaredMethods()获得代表所有方法的Method[]数组,遍历数组,判断如果是访问控制符为“public”即为公方法。

【案例实现】

StringUtils.java

  1. package chapter1201;
  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.Field;
  4. import java.lang.reflect.Method;
  5. import java.lang.reflect.Modifier;
  6. public class StringUtils {
  7.     @SuppressWarnings("unchecked")
  8.     public String toString(Object object) {
  9.         // 获得代表该类的Class对象
  10.         Class clazz = object.getClass();
  11.         // 利用StringBuilder来保存字符串
  12.         StringBuilder sb = new StringBuilder();
  13.         // 获得类所在的包
  14.         Package packageName = clazz.getPackage(); 
  15.         // 输出类所在的包
  16.         sb.append("包名:" + packageName.getName() + "\t");
  17.         String className = clazz.getSimpleName(); // 获得类的简单名称
  18.         sb.append("类名:" + className + "\n"); // 输出类的简单名称
  19.         sb.append("公共构造方法:\n");
  20.         // 获得所有代表构造方法的Constructor数组
  21.         Constructor[] constructors = clazz.getDeclaredConstructors();
  22.         for (Constructor constructor : constructors) {
  23.             String modifier =
  24.         Modifier.toString(constructor.getModifiers());// 获得方法修饰符
  25.             if (modifier.contains("public")) {// 查看修饰符是否含“public”
  26.                 sb.append(constructor.toGenericString() + "\n");
  27.             }
  28.         }
  29.         sb.append("公共域:\n");
  30.         // 获得代表所有域的Field数组
  31.         Field[] fields = clazz.getDeclaredFields();
  32.         for (Field field : fields) {
  33.             String modifier = Modifier.toString(field.getModifiers());
  34.             if (modifier.contains("public")) {// 查看修饰符是否含“public”
  35.                 sb.append(field.toGenericString() + "\n");
  36.             }
  37.         }
  38.         sb.append("公共方法:\n");
  39.         // 获得代表所有方法的Method[]数组
  40.         Method[] methods = clazz.getDeclaredMethods();
  41.         for (Method method : methods) {
  42.             String modifier = Modifier.toString(method.getModifiers());
  43.         // 查看修饰符是否含有“public”
  44.         if (modifier.contains("public")) {
  45.                 sb.append(method.toGenericString() + "\n");
  46.             }
  47.         }
  48.         return sb.toString();
  49.     }
  50.    public static void main(String[] args) {
  51.         System.out.println(new StringUtils().toString(new Object()));
  52.     }
  53. }

上述代码中,第51行代码的new StringUtils().toString(new Object())创建了一个StringUtils对象并调用了其toString()方法,并向toString()方法中传递了一个Object对象。第10行代码通过Object对象.getClass()获得代表该类的Class对象;第14行代码通过Object对象. getPackage()获得类所在的包;第21行代码通过Object对象. getDeclaredConstructors()获得所有代表构造方法的Constructor[]数组,第22-28行代码为遍历Constructor数组,判断如果是访问控制符为“public”即为公共构造方法。第31行代码通过类的Class对象.getDeclaredFields()获得代表所有域的Field[]数组,第32-37行代码为遍历Field数组,判断如果是访问控制符为“public”即为公共域。第40行代码通过类的Class对象.getDeclaredMethods()获得代表所有方法的Method[]数组,第41-49行代码为遍历Method[]数组,判断如果是访问控制符为“public”即为公方法。

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

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

相关文章

3D可视化大屏制作真的那么难?没有好用的软件解决吗?

有多少人印象里的数据可视化大屏还是像这样的二维大屏?这种二维可视化大屏早就不能满足审美日益提高的大众了。 现在用的都是3D可视化大屏,这种结合了3D技术的可视化形式不仅让数据更加的清晰,也增加了美感,这观看体验&#xff…

【数据结构】单链表——增删查改【万字介绍】

目录 一,线性表 1,什么是线性表 2,线性表的结构 二,链表 1,什么是链表 2,链表的分类 3,单链表的特点 三,链表的实现 1,结构的定义 2,创建一个新结点 3&#…

ChatGPT 不是黑魔法,“替代搜索引擎”言之尚早

ChatGPT 火了。整个 LLM 和搜索领域都已经在过去几个月内发生了翻天覆地的变化。ChatGPT 不再是一个玩具,它开始被微软、谷歌集成在搜索以及各个 SaaS 服务中,且取得了令人惊叹的效果。我尝试着使用 ChatGPT 回答过去一个月搜索过的 30 个问题&#xff0…

10个必须知道的JavaScript技巧,让你成为更好的程序员

1.Promise回调地狱Promises 提供了一种优雅的方式来处理 JavaScript 中的异步操作。这也是避免“回调地狱”的解决方案之一。但是我并没有真正理解它的意思,所以我写了这段代码。我做了这些事情:先获取用户的基本信息。按用户信息获取所有文章的简要摘要…

SPI_Master驱动程序框架

SPI_Master驱动程序框架 文章目录SPI_Master驱动程序框架一、SPI传输概述1.1 数据组织方式1.2 SPI控制器数据结构二、 SPI传输函数的两种方法2.1 老方法2.2 新方法致谢参考内核源码: drivers\spi\spi.c 一、SPI传输概述 1.1 数据组织方式 使用SPI传输时,最小的传…

hutool日期工具类相关:获取某月所有周、某周的起止时间或所有日期、计算连续天数

目录前言实现1、获取当月的所有周2、根据指定的第几周,获取这周的开始、结束时间3、获取当前月某一周的所有日期4、多个日期中,计算最大的连续天数5、判断指定日期是否在某个范围内前言 最近做项目,碰到一个比较复杂的日期查询方式&#xff…

内网vCenter部署教程二,最全的了!

一、组网说明 vCenter组网最佳实践 每台服务器需要6个网口,需要三个分布式交换机,每个交换机分配2个物理网卡做冗余,分别做为管理网络、业务网络、高可用网络使用。另vsan网络和vmotion网络可以复用业务网络或管理网络,vcenter HA需要单独用一个网络。 二、创建管理网络…

Ubuntu通过rsync和inotify实现双机热备

Rsync Inotify双机热备 一、备份机操作 备份机:主服务器或主机文件将需要备份的文件同步到此服务器上,即从主服务器上同步过来进行备份。 1.1安装rsync sudo apt-get install rsync1.2修改/etc/dault/rsync文件 sudo vim /etc/default/rsync修改如…

二叉树——修剪二叉搜索树

669. 修剪二叉搜索树 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代…

GPT:通用预训练语言模型

论文标题:Improving Language Understanding by Generative Pre-Training论文链接:https://www.cs.ubc.ca/~amuham01/LING530/papers/radford2018improving.pdf论文来源:OpenAI一、概述从无标注文本中高效学习的能力对于缓解对监督学习的依赖…

PLUMBER Boosting the Propagation of Vulnerability Fixes in the npm Ecosystem

PLUMBER: Boosting the Propagation of Vulnerability Fixes in the npm Ecosystem 1.背景 npm是JavaScript编程语言中最大的生态系统,截至2022年1月,它拥有超过180万个第三方软件包。2017年11月2日的npm快照进行的调查显示,在610,097个包中…

从16K跳槽到20K,最后算下来年薪却还降了,我笑了····

跳槽时薪资涨了 4000,但年薪总包算下来反而变少了,这是怎么回事? 上周,我星球里一个同学就遇到了这么一个问题,薪资涨了、总包降了,而且谈薪时把自己坑了。 作为一个案例,我觉得对很多人可能会…

【项目设计】高并发内存池 (四)[pagecache实现]

🎇C学习历程:入门 博客主页:一起去看日落吗持续分享博主的C学习历程博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 也许你现在做的事情,暂时看不到成果,但不要忘记&…

数据结构:堆的实现与建堆时间复杂度分析

目录 前言 一.堆的介绍 1.堆的本质 2.堆的分类 二.堆的实现(以小根堆为例) 1.关于二叉树的两组重要结论: 2.堆的物理存储结构框架(动态数组的简单构建) 3. 堆元素插入接口(以小根堆为例) 堆尾元素向上调整的算法接口: 4.堆元素插入接口测试 5.堆元素插入…

【chatgpt】教你如何创建一个Vue脚手架

要创建一个Vue脚手架,您可以使用Vue CLI。Vue CLI是一个命令行工具,可帮助您快速创建Vue项目并提供开发环境。 以下是使用Vue CLI创建Vue脚手架的步骤: 首先,您需要安装Node.js。您可以在Node.js官网上下载和安装它。安装Vue CL…

计网面试题-在浏览器中输入url地址到显示主页的过程

先说答案哈 1DNS解析( DNS解析就是把一个域名转换成一个IP地址。)1)、先到浏览器的DNS缓存中查询是否有对应记录,如有则直接返回ip地址,完成解析,如果没有则下一步;2)、继续查询本地host文件,…

TIA博途中通过SCL语言实现快速排序的具体方法示例

TIA博途中通过SCL语言实现快速排序的具体方法示例 首先,了解一下快速排序的原理: 排序算法的思想非常简单,在待排序的数列中,我们首先要找一个数字作为基准数。为了方便,我们一般选择第 1 个数字作为基准数(其实选择第几个并没有关系)。接下来我们需要将这个待排序的数列…

Python开发之Python导包的几种方法,自定义包的生成以及导入详解

Python是一种跨平台的计算机程序设计语言。 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。 下面介绍python的几种…

网络协议---TCP和UDP

文章目录TCPTCP简介内容TCP三次握手建立连接TCP四次挥手断开连接常见面试题TCP连接资源UDPUDP简介内容TCP TCP简介内容 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议&#xff0c…

MySQL-DQL语句

DQL语句 DQL(Data Query Language)查询数据 操作查询:select简单的查询,复杂的查询数据库中最核心的语言,最重要的语句使用频繁的语句 指定查询 查询全部 语法: select 全部字段(*&#x…