如何反射获取类的全部信息?(java代码)

news2024/9/20 14:45:13

什么是反射?

反射是 Java 提供的一种机制,允许在运行时动态地获取类的信息(如类的名称、方法、字段等),以及创建对象和调用方法。反射利用了 java.lang.reflect 包中的类,如 Class、Method、Field 和 Constructor。

本文用以下代码,通过反射机制实现对类结构的可视化。

当用户输入任意类名时,程序会打印出该类的构造函数、方法及字段的信息,没有找到目标类会输出ClassNotFoundException到控制台。

具体步骤:

1、输入类名:

传入我们想要去获取哪个类的信息

2、加载类:

使用 Class.forName(name) 动态加载指定的类,并获取 Class 对象。获取该类的父类 supercl,如果它的父类不是Object就给它标上继承自哪里。

Class cl = Class.forName(name);
Class supercl = cl.getSuperclass();
String modifiers = Modifier.toString(cl.getModifiers());
if(modifiers.length()>0) System.out.print(modifiers + " ");
System.out.print("class " + name);
if(supercl !=null && supercl != Object.class) System.out.print(" extends "+ supercl.getName());

3、打印类信息:

        (1.打印类的构造函数
	public static void printConstructors(Class cl){
		Constructor [] constructors = cl.getDeclaredConstructors();
		for (Constructor c : constructors){
			String name = c.getName();
			System.out.print("   ");
			String modifiers = Modifier.toString(c.getModifiers());
			if (modifiers.length() > 0) System.out.print(modifiers + " ");
			System.out.print(name + "(");

			Class[] paramTypes = c.getParameterTypes();
			for (int j = 0; j < paramTypes.length; j++){
				if (j > 0) System.out.print(", ");
				System.out.print(paramTypes[j].getName());
			}
			System.out.println(");");
		}
	}
        (2.打印类的方法
public static void printMethods(Class cl){
		Method[] methods = cl.getDeclaredMethods();
		for (Method m : methods){
			Class retType = m.getReturnType();
			String name = m. getName();
			System.out.print("   ");

			String modifiers = Modifier.toString(m.getModifiers());
			if (modifiers.length() > 0) System.out.print(modifiers +" ");
			System. out.print(retType. getName() + " "+ name + "(");

			Class [] paramTypes = m.getParameterTypes();
			for (int j = 0; j < paramTypes.length; j++){
			if (j > 0) System.out.print(", ");
				System.out.print(paramTypes[j].getName());
			}
			System.out.println(");");
		}
	}
        (3.打印类的所有字段
	public static void printFields(Class cl){
		Field[] fields = cl.getDeclaredFields();
		for (Field f : fields){
			Class type = f.getType();
			String name = f.getName();
			System.out.print("   ");
			String modifiers = Modifier.toString(f.getModifiers());
			if (modifiers.length() > 0) System.out.print(modifiers + " ");
			System.out.println(type.getName() + " " + name + ";");
		}
	}

4、异常处理:

如果输入的指定类找不到,会抛出ClassNotFoundException异常,捕获并打印出来,方便后续调试。

catch (ClassNotFoundException e)
	{
		//System.out.println("输入的类没有找到");
		e.printStackTrace();
	}

java代码:

public class ReflectionTest {
	public static void main(String[] args) {
		String name;
		if(args.length>0) name = args[0];
		else {
			Scanner in = new Scanner(System.in);
			System.out.println("请输入类名 (例如: java.util.Date");
			name = in.next();
		}
		
		try {
			Class cl = Class.forName(name);
			Class supercl = cl.getSuperclass();
			String modifiers = Modifier.toString(cl.getModifiers());
			if(modifiers.length()>0) System.out.print(modifiers + " ");
			System.out.print("class " + name);
			if(supercl !=null && supercl != Object.class) System.out.print(" extends "+ supercl.getName());
			System.out.println("\n{\n");
			printConstructors(cl);//打印构造函数
			System.out.println();
			printMethods(cl);//打印方法
			System.out.println();
			printFields(cl);//打印字段
			System.out.println("}");
		}
		catch (ClassNotFoundException e)
		{
			//System.out.println("输入的类不存在");
			e.printStackTrace();
		}
		System.exit(0);
	}
	public static void printConstructors(Class cl){
		Constructor [] constructors = cl.getDeclaredConstructors();
		for (Constructor c : constructors){
			String name = c.getName();
			System.out.print("   ");
			String modifiers = Modifier.toString(c.getModifiers());
			if (modifiers.length() > 0) System.out.print(modifiers + " ");
			System.out.print(name + "(");

			Class[] paramTypes = c.getParameterTypes();
			for (int j = 0; j < paramTypes.length; j++){
				if (j > 0) System.out.print(", ");
				System.out.print(paramTypes[j].getName());
			}
			System.out.println(");");
		}
	}
	public static void printMethods(Class cl){
		Method[] methods = cl.getDeclaredMethods();
		for (Method m : methods){
			Class retType = m.getReturnType();
			String name = m. getName();
			System.out.print("   ");

			String modifiers = Modifier.toString(m.getModifiers());
			if (modifiers.length() > 0) System.out.print(modifiers +" ");
			System. out.print(retType. getName() + " "+ name + "(");

			Class [] paramTypes = m.getParameterTypes();
			for (int j = 0; j < paramTypes.length; j++){
			if (j > 0) System.out.print(", ");
				System.out.print(paramTypes[j].getName());
			}
			System.out.println(");");
		}
	}
	public static void printFields(Class cl){
		Field[] fields = cl.getDeclaredFields();
		for (Field f : fields){
			Class type = f.getType();
			String name = f.getName();
			System.out.print("   ");
			String modifiers = Modifier.toString(f.getModifiers());
			if (modifiers.length() > 0) System.out.print(modifiers + " ");
			System.out.println(type.getName() + " " + name + ";");
		}
	}
}

运行结果:

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

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

相关文章

仿BOSS招聘系统开发:构建高效、智能的在线招聘平台

在数字化时代&#xff0c;招聘行业正经历着前所未有的变革。BOSS直聘作为国内领先的招聘平台&#xff0c;以其高效的匹配机制、丰富的职位信息和便捷的用户体验&#xff0c;赢得了广泛的市场认可。本文将探讨如何开发一个仿照BOSS招聘系统的在线招聘平台&#xff0c;旨在为企业…

8月28复盘日记

8月28复盘日记 前言今日感恩今日知识今日反思今日名言 前言 今天早上是六点半起床嘻嘻&#xff0c;这两天因为生理期,皮质醇似乎有些高,入睡会有些困难。但是因为今天是开学第一天&#xff0c;意味着&#xff0c;健身房恢复晨练了&#xff01;我可太喜欢晨练时间安安静静的健身…

怎么又快又好制作流程图?试试这2款流程图制作神器,专业!

推荐2款简单好用的流程图制作软件&#xff0c;帮你轻松搞定各种流程图。 1、GitMind 点点击链接直达官网>>gitmind.cn GitMind是一个在线流程图制作工具&#xff0c;模板类型全&#xff0c;支持免费下载&#xff0c;由国内团队研发&#xff0c;操作简单&#xff0c;使用…

功率器件和滤波器件的选型及测试方法

目录 一、功率器件的选型及测试方法 1.1功率器件的选型 1.2功率器件的测试方法 二、滤波器件的选型及测试方法 2.1滤波器件的选型 2.2滤波器件的测试方法 三、表格总结 一、功率器件的选型及测试方法 1.1功率器件的选型 在电子电路设计中&#xff0c;功率器件的选择是…

c++异常处理(c++11版)与智能指针 SmartPtr 的应用(主讲shared_ptr浅实现)

引子&#xff1a;找C语言的异常时&#xff0c;你是否会被奇怪的错误码或程序终止报错而感到无奈&#xff0c;对找不到错误在哪的心烦&#xff1f;在害怕内存泄漏时&#xff0c;你是否每一步&#xff0c;每一句代码都要仔细分析&#xff0c;在用完之后进行资源空间的释放&#x…

用powermock编写单元测试

1、pom文件引入jar包 <!-- 单元测试 start --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope> </dependency> <dependency>&…

Jenkins服务安装配置

什么是 Jenkins Jenkins 是一个开源的自动化服务器&#xff0c;主要用于持续集成&#xff08;CI&#xff0c;Continuous Integration&#xff09;和持续交付/持续部署&#xff08;CD/CD&#xff0c;Continuous Delivery/Continuous Deployment&#xff09;。它帮助开发团队自动…

48.【C语言】结构体补充

承接20.【C语言】初识结构体&#xff08;重要&#xff09;中的结构体成员的访问 目录&#xff1a; 1.结构体创建 2.利用函数控制结构体 3.使用“结构体指针变量-->结构体成员变量”来修改结构体的数据 4.传值还是传址&#xff1f; 1.结构体创建 依据第20篇&#xff0c;可以…

Kafka【三】Windows下安装Kafka集群

前文&#xff1a;Kafka【一】Windows下安装单节点Kafka ① 安装ZooKeeper 在D:\创建文件夹kafkacluster&#xff0c;将kafka安装包kafka_2.12-3.6.1解压缩到kafka文件夹。 修改文件夹名为kafkazk 因为kafka内置了ZooKeeper软件&#xff0c;所以此处将解压缩的文件作为ZooKeep…

Ubuntu20.04可以同时安装ROS(Noetic)和ROS2(Humble)

Ubuntu系统确实可以同时安装ROS&#xff08;Robot Operating System&#xff09;和ROS2&#xff0c;但需要注意一些关键步骤和配置以确保两者能够顺利共存并独立运行。以下是在Ubuntu上同时安装ROS和ROS2的详细步骤和注意事项&#xff1a; 安装前准备 检查Ubuntu版本&#xff…

CTFHub SSRF靶场通关攻略

内网访问 首先进入环境 在url后面输入 http://127.0.0.1/flag.php访问&#xff0c;得出flag 伪协议读取文件 进入环境后再url后面拼接 file:///var/www/html/flag.php 访问后是&#xff1f;&#xff1f;&#xff1f;&#xff0c;那么我们F12检查源码得出flag 端口扫描 我们进行…

【苍穹外卖】Day2 员工接口 分类接口

1 新增员工 1.1 设计 前端表单&#xff1a; 路径&#xff1a;/admin/employee 方法&#xff1a;POST 本项目约定: 管理端发出的请求&#xff0c;统一使用 /admin 作为前缀 用户端发出的请求&#xff0c;统一使用 /user 作为前缀 存在数据库中的实体类对象&#xff1a; pac…

73 OSPF图解LSA(华三)

71 OSPF多区域实验(华三)-CSDN博客文章浏览阅读166次,点赞8次,收藏3次。实操https://blog.csdn.net/qq_56248592/article/details/141563010?spm=1001.2014.3001.5501 一 基础配置省略 上次的原图基础上扩展

openGuass——表空间、数据库、Schema详解

目录 一、表空间 二、数据库 三、模式:Schema 四、database schema table之间的关系 五、表 六、分区表 七、索引 八、视图 九、序列 十、同义词 十一、约束 一、表空间 自带了两个表空间&#xff1a;pg_default和pg_global。查看命令&#xff1a;\db 默认表空间pg…

力扣刷题(2)

寻找两个正序数组的中位数 寻找两个正序数组的中位数-力扣 思路: 合并两个正序数组找中位数 double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {int arr[nums1Size nums2Size];int n1 0, n2 0;int m 0;int q;//合并两个正序数组w…

非阻塞轮询

目录 前言1.options 参数2. 非阻塞轮询3. 模拟非阻塞轮询4. 非阻塞轮询 执行其它任务 前言 继上一篇文章 详谈进程等待 讲到 waitpid 系统调用&#xff0c;在该系统调用接口中还有一个 options 参数&#xff0c;本篇文章介绍 watipid 系统调用中的options 参数 以及 什么是非…

numpy 中的降维与升维

升维&#xff08;Dimensionality Augmentation&#xff09;&#xff1a;增加数据的维度&#xff0c;通常用于提供更多信息或从不同的角度看待数据。 降维&#xff08;Dimensionality Reduction&#xff09;&#xff1a;减少数据的维度&#xff0c;通常用于简化数据或去除无关紧…

微信删除了好友如何恢复?试试这3种方法,赶紧收藏!shuju

推荐3种恢复微信聊天记录的方法&#xff0c;帮你找回微信好删除好友的聊天记录&#xff01; 操作简单&#xff0c;可用于iOS、安卓手机和PC电脑端 1、万兴数据管家 点击直达官网下载>>https://huifu.wondershare.cn 万兴数据管家是一款专业的微信数据恢复软件。 支持苹…

免费屏幕录制软件有哪些?2024年最新测评15款录屏软件排行榜!

免费屏幕录制软件有哪些?2024年最新测评15款录屏软件排行榜! 录屏软件数不胜数&#xff0c;百度一搜跳出来成百上千款录屏软件&#xff01;专业的用起来太复杂&#xff0c;简单的又不堪其用&#xff01;还有各种各样防不胜防的套路。如果你没有像我一样深度了解过不同录屏软件…

基于huggingface peft进行qwen1.5-7b-chat训练/推理/服务发布

一、huggingface peft微调框架 1、定义 PEFT 是一个为大型预训练模型提供多种高效微调方法的Python库。 微调传统范式是针对每个下游任务微调模型参数。大模型参数总量庞大&#xff0c;这种方式变得极其昂贵和不切实际。PEFT采用的高效做法是训练少量提示参数(Prompt Tuning…