C语言——史上最全通讯录讲解(附源码)

news2024/12/24 10:24:38

C语言——史上最全通讯录讲解(附源码)

  • 一、开始界面的打印
  • 二、对六大板块进行定义操作
  • 三、对联系人进行初始化
  • 四、对通讯录进行初始化
    • 4.1动态版本
    • 4.2静态版本
  • 五、通讯录六大功能的具体实现
    • 5.1判断是否需要扩容Checkcapcity
    • 5.2添加联系人ADDcontact
    • 5.3删除联系人 DELcontact
      • 5.3.1 Findname
      • 5.3.2删除联系人
    • 5.4 查找联系人 SEARCHcontact
    • 5.5 修改联系人MODIFYcontac
    • 5.6对联系人进行排序SORTcontact
    • 5.7销毁通讯录Destory
    • 5.5显示联系人信息SHOWcontact
  • 六、通讯录源码
    • 6.1 Contact.h
    • 6.2 Contact.c
    • 6.3 test.c
    • 6.4 代码运行

本次通讯录的实现,我将其分为6大板块,分别是添加联系人,删除联系人,展示联系人,修改联系人,查询指定联系人,将联系人按照姓名进行排序。

一、开始界面的打印

首先我们需要创建一个美观的界面,让我们所制作的通讯录看起来更加的规范,更加的整洁,而界面的制作我们在这里就简单的运用了一下printf函数,代码如下,当然大家也可以选择自己喜欢的样式去制作一个自己喜欢的开始界面。

void menu()
{
	printf("***************************\n");
	printf("*****1.add       2.del*****\n");
	printf("*****3.show   4.search*****\n");
	printf("*****5.modify   6.sort*****\n");
	printf("*****7.exit           *****\n");
	printf("***************************\n");

}

二、对六大板块进行定义操作

我们可以采用联合体进行对六大板块的一个定义操作,因为联合体里面的定义内容其本质上就是数字0,1,2…

enum option
{
	exit,
	add,
	del,
	show,
	search,
	modify,
	sort
};

三、对联系人进行初始化

contact.h中对联系人进行初始化,这里我们采用结构体的方式,对联系人的个人信息进行一定的简单初始化,为了方便日后可能需要对数字重新定义的需求,这里我们采用typedef的方式定义一些变量

#define MAX 100
#define MAX_name 20
#define MAX_sex  5
#define MAX_tele 15
#define MAX_addr 20
#define DEFAULT_sz 3
#define INC_SZ 3

通讯录的联系人的初始化

typedef struct Peopleinformatin
{
	char name[MAX_name];
	char sex[MAX_sex];
	int age;
	char tele[MAX_tele];
	char addr[MAX_addr];
}Peopleinformatin;

四、对通讯录进行初始化

通讯录的初始化分为两个版本,静态版本和动态版本,其中动态版本可以通过坚持联系人的信息,来判断是否需要扩充容量。

4.1动态版本

void Initcontact(contact* pc)
{
	pc->data = (Peopleinformatin*)malloc(DEFAULT_sz * sizeof(Peopleinformatin));
	if (NULL == pc->data)
	{
		printf("初始化空间失败:%s", strerror(errno));
	}
	pc->sz = 0;
	pc->capacity = DEFAULT_sz;
	

4.2静态版本

//静态版本
//初始化联系人
void Initcontact(contact* pc)
{
	pc->sz = 0;
    memset(pc->data, 0, sizeof(pc->data));
}

五、通讯录六大功能的具体实现

5.1判断是否需要扩容Checkcapcity

该函数可以通过判断,以达到是否需要进行扩容的目的

int Checkcapcity(contact* pc)
{
	if (pc->sz == pc->capacity)//表明需要进行扩容
	{
		Peopleinformatin* ptr = (Peopleinformatin*)realloc(pc->data, (DEFAULT_sz + INC_SZ) * sizeof(Peopleinformatin));
		if (ptr == NULL)
		{
			printf("扩容失败:%s", strerror(errno));
			return 0;
		}
		else
		{
			pc->data = ptr;
			pc->capacity += INC_SZ;
			printf("扩容成功:%d", pc->capacity);
			return 1;
		}
		return 1;
	}
}

5.2添加联系人ADDcontact

通过该函数达到添加联系人各项基本信息的目的,在使用该函数前,首先要利用Checkcapcity函数来判断是否要进行扩容操作,来达到存放联系人信息的目的。

void ADDcontact(contact* pc)
{
	if (Checkcapcity(pc) == 0)
	{
		printf("扩容失败:%s", strerror(errno));
		return;
	}
	else
	{
		printf("请输入联系人姓名:");
		scanf("%s", pc->data[pc->sz].name);
		printf("请输入联系人年龄:");
		scanf("%d", &(pc->data[pc->sz].age));
		printf("请输入联系人性别:");
		scanf("%s", pc->data[pc->sz].sex);
		printf("请输入联系人电话:");
		scanf("%s", &(pc->data[pc->sz].tele));
		printf("请输入联系人地址:");
		scanf("%s", pc->data[pc->sz].addr);
		printf("添加成功\n");
		pc->sz++;
	}

}

5.3删除联系人 DELcontact

对联系人进行删除操作时,我们需要先找到该联系人,所以我们先要创建一个函数来找到该联系人,在本次的通讯录中,我采用查找名字的方式,来查找联系人。

5.3.1 Findname

通过strcmp函数来比较字符串中的信息是否相同,以此来达到查找联系人的目的。

int Findname(const contact *pc,char name[])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;
		}
	}
	return -1;

}

5.3.2删除联系人

通过FIndname找到联系人之后,便可以进行删除操作了。在这里我们定义了DELcontact来进行删除操作,我们在这里采用覆盖的方式,将后一个联系人的信息把前一个联系人的信息进行覆盖。

void DELcontact(contact* pc)
{
	char name[MAX_name] = { 0 };
	//查找联系人
	printf("请输入要查找人的姓名:");
	scanf("%s", name);
	int pos = Findname(pc, name);
	if (pos == -1)
	{
		printf("查询的联系人没有找到\n");
	}
	int i = 0;
	//删除操作
	for (i = 0; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功\n");
}

5.4 查找联系人 SEARCHcontact

void SEARCHcontact(contact* pc)
{
	char name[MAX_name] = { 0 };
	printf("请输入要查找人的姓名:");
	scanf("%s", name);
	int ret = Findname(pc, name);
	if (ret == -1)
	{
		printf("通讯录中没有该联系人\n");
		return;
	}
	//打印标题
	printf("%-10s %-5s %-10s %-20s %-10s\n", "姓名", "性别", "年龄", "电话", "地址");
   //打印数据
	printf("%-10s %-5s %-10d %-20s %-10s\n", pc->data[ret].name, pc->data[ret].sex, pc->data[ret].age, pc->data[ret].tele, pc->data[ret].addr);
}

5.5 修改联系人MODIFYcontac

首先对通过前文的Findname函数找到要修改的联系人信息,之后便可以对其进行修改操作。

void MODIFYcontact(contact* pc)
{
	char name[MAX_name] = { 0 };
	printf("请输入要修改联系人的姓名:");
	scanf("%s", name);
	int  ret = Findname(pc, name);
	if (ret == -1)
	{
		printf("通讯录中没有该联系人\n");
		return;
	}
	//修改
	printf("请输入姓名:");
	scanf("%s", pc->data[ret].name);
	printf("请输入年龄:");
	scanf("%d", &(pc->data[ret].age));
	printf("请输入性别:");
	scanf("%s", pc->data[ret].sex);
	printf("请输入电话:");
	scanf("%s", pc->data[ret].tele);
	printf("请输入地址:");
	scanf("%s", pc->data[ret].addr);
	printf("修改成功\n");
}

5.6对联系人进行排序SORTcontact

采用qsort对联系人按照姓名进行排序。
在这里插入图片描述

int cmp_by_name(const void* e1, const void* e2)
{
	return strcmp(((Peopleinformatin*)e1)->name, ((Peopleinformatin*)e2)->name);
}
void SORTcontact(contact* pc)
{
	qsort(pc->data, pc->sz, sizeof(Peopleinformatin), cmp_by_name);
	printf("修改成功\n");
}

5.7销毁通讯录Destory

通过**free释放所申请的空间,并将其置为NULL**。

void Destory(contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->capacity = NULL;
	pc->sz = NULL;
	printf("销毁内存成功\n");
}

5.5显示联系人信息SHOWcontact

void SHOWcontact(const contact* pc)
{
	//打印标题
	int i = 0;
	printf("%-10s %-5s %-10s %-20s %-10s\n", "姓名", "性别", "年龄", "电话", "地址");
	//打印数据
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-10s %-5s %-10d %-20s %-10s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].addr);
	}
}

六、通讯录源码

6.1 Contact.h

#pragma once
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#include<errno.h>
#define MAX 100
#define MAX_name 20
#define MAX_sex  5
#define MAX_tele 15
#define MAX_addr 20
#define DEFAULT_sz 3
#define INC_SZ 3


typedef struct Peopleinformatin
{
	char name[MAX_name];
	char sex[MAX_sex];
	int age;
	char tele[MAX_tele];
	char addr[MAX_addr];
}Peopleinformatin;
//动态版本
typedef struct contact
{
	Peopleinformatin* data;//指向存放数据的空间
	int sz;//保存当前存放联系人的个数
	int capacity;//通讯录的容量
 }contact,*pcontact;//重新定义命名

//初始化通讯录
void Initcontact(contact *pc);

//销毁通讯录
void Destory(contact* pc);

//添加联系人
void ADDcontact(contact* pc);

//显示通讯录
void SHOWcontact(const contact* pc);

//删除联系人
void DELcontact(contact* pc);

//查询联系人
void SEARCHcontact(contact* pc);

//修改联系人信息
void MODIFYcontact(contact* pc);

//按名字对联系人信息进行排序
void SORTcontact(contact* pc);

6.2 Contact.c

#include"contact.h"
//动态版本的初始化
void Initcontact(contact* pc)
{
	pc->data = (Peopleinformatin*)malloc(DEFAULT_sz * sizeof(Peopleinformatin));
	if (NULL == pc->data)
	{
		printf("初始化空间失败:%s", strerror(errno));
	}
	pc->sz = 0;
	pc->capacity = DEFAULT_sz;
	
}

//动态版本添加联系人
//判断是否需要进行扩容
int Checkcapcity(contact* pc)
{
	if (pc->sz == pc->capacity)//表明需要进行扩容
	{
		Peopleinformatin* ptr = (Peopleinformatin*)realloc(pc->data, (DEFAULT_sz + INC_SZ) * sizeof(Peopleinformatin));
		if (ptr == NULL)
		{
			printf("扩容失败:%s", strerror(errno));
			return 0;
		}
		else
		{
			pc->data = ptr;
			pc->capacity += INC_SZ;
			printf("扩容成功:%d", pc->capacity);
			return 1;
		}
		return 1;
	}
}
void ADDcontact(contact* pc)
{
	if (Checkcapcity(pc) == 0)
	{
		printf("扩容失败:%s", strerror(errno));
		return;
	}
	else
	{
		printf("请输入联系人姓名:");
		scanf("%s", pc->data[pc->sz].name);
		printf("请输入联系人年龄:");
		scanf("%d", &(pc->data[pc->sz].age));
		printf("请输入联系人性别:");
		scanf("%s", pc->data[pc->sz].sex);
		printf("请输入联系人电话:");
		scanf("%s", &(pc->data[pc->sz].tele));
		printf("请输入联系人地址:");
		scanf("%s", pc->data[pc->sz].addr);
		printf("添加成功\n");
		pc->sz++;
	}

}

//显示联系人
void SHOWcontact(const contact* pc)
{
	//打印标题
	int i = 0;
	printf("%-10s %-5s %-10s %-20s %-10s\n", "姓名", "性别", "年龄", "电话", "地址");
	//打印数据
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-10s %-5s %-10d %-20s %-10s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].addr);
	}
}
//查找名字的函数
int Findname(const contact *pc,char name[])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;
		}
	}
	return -1;

}
//删除联系人
void DELcontact(contact* pc)
{
	char name[MAX_name] = { 0 };
	//查找联系人
	printf("请输入要查找人的姓名:");
	scanf("%s", name);
	int pos = Findname(pc, name);
	if (pos == -1)
	{
		printf("查询的联系人没有找到\n");
	}
	int i = 0;
	//删除操作
	for (i = 0; i < pc->sz - 1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功\n");
}

//查找联系人
void SEARCHcontact(contact* pc)
{
	char name[MAX_name] = { 0 };
	printf("请输入要查找人的姓名:");
	scanf("%s", name);
	int ret = Findname(pc, name);
	if (ret == -1)
	{
		printf("通讯录中没有该联系人\n");
		return;
	}
	//打印标题
	printf("%-10s %-5s %-10s %-20s %-10s\n", "姓名", "性别", "年龄", "电话", "地址");
   //打印数据
	printf("%-10s %-5s %-10d %-20s %-10s\n", pc->data[ret].name, pc->data[ret].sex, pc->data[ret].age, pc->data[ret].tele, pc->data[ret].addr);
}

//修改联系人信息
void MODIFYcontact(contact* pc)
{
	char name[MAX_name] = { 0 };
	printf("请输入要修改联系人的姓名:");
	scanf("%s", name);
	int  ret = Findname(pc, name);
	if (ret == -1)
	{
		printf("通讯录中没有该联系人\n");
		return;
	}
	//修改
	printf("请输入姓名:");
	scanf("%s", pc->data[ret].name);
	printf("请输入年龄:");
	scanf("%d", &(pc->data[ret].age));
	printf("请输入性别:");
	scanf("%s", pc->data[ret].sex);
	printf("请输入电话:");
	scanf("%s", pc->data[ret].tele);
	printf("请输入地址:");
	scanf("%s", pc->data[ret].addr);
	printf("修改成功\n");
}
//按名字对联系人信息进行排序
int cmp_by_name(const void* e1, const void* e2)
{
	return strcmp(((Peopleinformatin*)e1)->name, ((Peopleinformatin*)e2)->name);
}
void SORTcontact(contact* pc)
{
	qsort(pc->data, pc->sz, sizeof(Peopleinformatin), cmp_by_name);
	printf("修改成功\n");
}

//销毁通讯录
void Destory(contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->capacity = NULL;
	pc->sz = NULL;
	printf("销毁内存成功\n");
}

6.3 test.c

#include"contact.h"
void menu()
{
	printf("**********************************\n");
	printf("****   1.ADD          2.DEL   ****\n");
	printf("****   3.SHOW         4.SEARCH****\n");
	printf("****   5.MODIFY       6.SORT  ****\n");
	printf("****   0.EXIT                 ****\n");
	printf("**********************************\n");
}
enum option
{
	EXIT,
	ADD,
	DEL,
	SHOW,
	SEARCH,
	MODIFY,
	SORT
};
int main()
{
	int input = 0;
	contact con;
	Initcontact(&con);//初始化通讯录
	menu();
	do
	{
		printf("请选择您要执行的功能:\n");
		scanf("%d", &input);
		switch (input)
		{
		case EXIT:
			Destory(&con);
			printf("您已成功退出通讯录\n");
			break;
		case ADD:
			ADDcontact(&con);
			break;
		case DEL:
			DELcontact(&con);
			break;
		case SHOW:
			SHOWcontact(&con);
			break;
		case SEARCH:
			SEARCHcontact(&con);
			break;
		case MODIFY:
			MODIFYcontact(&con);
			break;
		case SORT:
			SORTcontact(&con);
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;

		}

	} while (input);
	
	return 0;
}

6.4 代码运行

在这里插入图片描述

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

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

相关文章

Salesforce许可证和版本有什么区别,购买帐号时应该如何选择?

Salesforce许可证分配给特定用户&#xff0c;授予他们访问Salesforce产品和功能的权限。Salesforce版本和许可证是不同的概念&#xff0c;但极易混淆。 Salesforce版本&#xff1a;这是对组织购买的Salesforce产品和功能的访问权限。大致可分为Essentials、Professional、Ente…

E-office Server_v9.0 漏洞分析

漏洞简介 泛微e-office是一款标准化的协同OA办公软件&#xff0c;实行通用化产品设计&#xff0c;充分贴合企业管理需求&#xff0c;本着简洁易用、高效智能的原则&#xff0c;为企业快速打造移动化、无纸化、数字化的办公平台。由于泛微 E-Office 未能正确处理上传模块中输入…

解读赛力斯年报:华为智选车的B面

作者 | Amy 编辑 | 德新 赛力斯&#xff0c;华为智选车的B面。 2021年&#xff0c;赛力斯SF5进入华为渠道销售&#xff0c;华为自此开启了智选车模式。到年末&#xff0c;双方更是推出AITO品牌。AITO凭借M5/M7等车型在2022年拿下了超过7.5万台的销量&#xff0c;成为增长最快的…

无线模块|如何选择天线和设计天线电路

无线模块的通信距离是一项重要指标&#xff0c;如何把有效通信距离最大化一直是大家疑惑的问题。本文根据调试经验及对天线的选择与使用方法做了一些说明&#xff0c;希望对工程师快速调试通信距离有所帮助。 一、天线的种类 随着技术的进步&#xff0c;为了节省研发周期&…

Blender基础技巧小结(二)

本文续前一篇&#xff1a;Blender基础技巧小结_皮尔斯巴巴罗的博客-CSDN博客 由于2.83开始使用的是新版ui&#xff0c;但是2.83文档内并没有更新&#xff0c;所以最好参考3.3版文档 https://docs.blender.org/manual/zh-hans/3.3/interface/controls/buttons/menus.html 缩…

单片机:实战练习

目录 【1】GPIO 1.定义 2.应用 I - Input - 输入采集 O - Output - 输出控制 ​编辑​编辑 3.GPIO结构框图 4.功能描述 输入功能 输出功能 5.相关寄存器 【2】点亮一盏LED灯 1.实验步骤 2.编程实现 3.编译下载 4.复位上电 练习&#xff1a;实现LED灯闪烁…

“视频AI+职业教育”会碰撞出什么样的火花?

玩过腾讯智影、用过D-ID、体验过Vega Al&#xff0c;终于等到要出“视频AI教育”类的应用型产品了&#xff0c;很振奋。 展望&#xff1a; 已经实现AI情绪分析、AI智能审核、AI视频内容检索、AI多语言实时字幕、AI会议速记、AI窄带高清编码多种功能。 “视频AI职业教育”&#…

ubantu22里面配置apache2的cgi

在 Ubuntu 22.04 中配置 Apache2 的 CGI 1.安装 Apache2 在终端中使用以下命令安装 Apache2&#xff1a; sudo apt-get update sudo apt-get install apache22.启用 CGI 模块 在 Ubuntu 中默认情况下&#xff0c;CGI 模块是禁用的。您需要手动启用它。在终端中使用以下命令来启…

为什么要使用Thrift与Protocol Buffers?

编码数据的格式 程序通常&#xff08;至少&#xff09;使用两种形式的数据&#xff1a; 在内存中&#xff0c;数据保存在对象、结构体、列表、数组、散列表、树等中。 这些数据结构针对 CPU 的高效访问和操作进行了优化&#xff08;通常使用指针&#xff09;。如果要将数据写…

centos7中安装mattermost

centos7中安装mattermost 步骤如下: 第一步安装依赖项&#xff1a;在终端中执行以下命令以安装所需的依赖项 sudo yum install epel-release sudo yum install yum-utils sudo yum install wget第二步&#xff0c;下载Mattermost安装包&#xff1a;执行以下命令以下载Mattermo…

PowerShell Install 二进制方式部署Python3

Python 前言 Python 是一种解释型、面向对象、动态数据类型的高级程序设计语言。Python 由 Guido van Rossum 于 1989 年底发明&#xff0c;第一个公开发行版发行于 1991 年。像 Perl 语言一样, Python 源代码同样遵循 GPL(GNU General Public License) 协议。 Python downlo…

经典神经网络(3)Vgg-Net及其在Fashion-MNIST数据集上的应用

经典神经网络(3)VGG_使用块的网络 1 VGG的简述 1.1 VGG的概述 VGG-Net 是牛津大学计算机视觉组和DeepMind公司共同研发一种深度卷积网络&#xff0c;并且在2014年在ILSVRC比赛上获得了分类项目的第二名和定位项目的第一名。通过使⽤循环和⼦程序&#xff0c;可以很容易地在任…

JavaEE(系列6) -- 多线程(解决线程不安全系列1-- 加锁(synchronized)与volatile)

首先我们回顾一下上一章节引起线程不安全的原因 本质原因:线程在系统中的调度是无序的/随机的(抢占式执行) 1.抢占式执行 2.多个线程修改同一个变量. 一个线程修改一个变量>安全 多个线程读取同一个变量>安全 多个线程修改不同的变量>安全 3.修改操作,不是原子的.(最…

容器安装Datax+Datax-web2.1(一)

目录 简介1、安装Datax-web2.1.11&#xff09;安装docker-compose2&#xff09;创建Datax-web和MySQL容器 2、安装Datax-web2.1.21&#xff09;安装MySQL2&#xff09;初始化数据3&#xff09;安装datax和datax-web4&#xff09;浏览器登录 DataxDatax-web2.1实现MySQL数据库数…

LeetCode 21. 合并两个有序链表 | C++语言版

LeetCode 21. 合并两个有序链表 | C语言版 LeetCode 36&#xff1a; 两个链表的第一个公共结点题目描述解题思路思路一&#xff1a;使用前缀和代码实现运行结果参考文章&#xff1a; 思路二&#xff1a;减少遍历节点数代码实现运行结果参考文章&#xff1a; LeetCode 36&#x…

CANoe-如何在Trace窗口显示SYN和FIN报文、同一条以太网报文在Trace窗口中的多条显示

1、如何在Trace窗口显示SYN和FIN报文 当我们使用CANoe实现TCP通信时,希望在Trace窗口直观显示报文的类型:SYN、ACK、FIN。显然Trace窗口也是支持这样的功能的。但很多时候由于一些人为的不正确的设置和配置,造成无法显示。 如果想解析出SYN报文,首先在Trace窗口选择正确的…

5个高清视频素材网站,免费下载~

免费高清视频素材网站&#xff0c;这几个你一定要知道&#xff0c;建议收藏&#xff01; 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 菜鸟图库网素材非常丰富&#xff0c;网站主要还是以设计类素材为主&#xff0c;高清视频素材也很多&#xff0c;像风景、…

dcdc降压电路原理及仿真

在之前的文章 DCDC 降压芯片基本原理及选型主要参数介绍 中已经大致讲解了dcdc降压电路的工作原理&#xff0c;今天再结合仿真将buck电路工作过程讲一讲。 基本拓扑 上图为buck电路的基本拓扑结构&#xff0c;开关打到1&#xff0c;电感充电&#xff1b;开关打到0&#xff0c;…

pdf怎么转换成jpg格式的图片,5种方法详细教程

pdf怎么转换成jpg格式的图片&#xff0c;为什么这样做呢&#xff1f;那是因为将PDF转换成JPG格式的主要原因是方便在演示文稿、网页或社交媒体等平台上展示和分享PDF文件的内容。JPG格式具有广泛的兼容性和易于传输的特点&#xff0c;而且可以轻松地进行编辑和调整大小。此外&a…

Java反射简单介绍_01

文章目录 1. 什么是反射2. Java中类加载的三个阶段3. 反射机制提供的相关类4. Java中获取Class类的三种方式5. Class类提供的功能5.1. 获取Field类方法5.2. 获取Method类方法5.3. 获取Constructor类方法5.4. Class中其他方法 1. 什么是反射 Java中的反射主要是体现在运行期间,…