当前位置: 首页 > news >正文

Java中的反射是怎么回事?

反射的概念

《Java核心技术》中的定义是这样的:能够分析类能力的程序,就是反射

这就是一个概念,跟java中经常提的问题:对象是什么? 一类问题,简单来说就是将类创建对象的逻辑反过来,由对象获得其所属类型的信息。它允许程序在运行时查询和操作类、方法、字段等信息。

实现原理机制

说到反射就不得不谈一个Class类,就是类的类,存的是各种类的状态信息的类,Java的反射机制主要通过java.lang.Class类来实现。你可以通过Class.forName("类名")方法来获取一个Class对象,进而获取该类的信息。

  • Object 类中的getClass( ) 方法将会返回一个Class 类型的实例。
  • Class类常用的方法。
    • e.getname()获取e的类的名字
    • 静态方法Class.forName(className),返回对应的Class对象。
    • 来动态地创建一个类的实例e.getClass().newInstance();

 利用反射获取打印类的信息(也叫能力)

不是通过“ . ”的形式,获得一个类的方法,属性,等具体信息

package test729;import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;public class ReflectionTest {/*** 判断程序启动时是否有命令行参数。如果有,则将第一个参数作为类名;如果没有,则提示用户输入类名并读取用户输入。* @param args*/public static void main(String[] args) {String className;if (args.length > 0) {className = args[0];} else {Scanner scanner = new Scanner(System.in);System.out.println("请输入类名(如:java.util.Date):");className = scanner.next();}
/***使用 Class.forName(className) 动态加载指定的类。然后获取该类的父类和修饰符。* 打印类的修饰符、类名和父类信息。* 调用 printConstructors(cl), printMethods(cl), 和 printFields(cl) 方法,分别打印构造函数、方法和字段的信息。* 捕捉并处理 ClassNotFoundException 异常,打印异常信息。*/try {Class<?> cl = Class.forName(className);Class<?> superClass = cl.getSuperclass();String modifiers = Modifier.toString(cl.getModifiers());if (modifiers.length() > 0) {System.out.print(modifiers + " ");}System.out.print("class " + className);if (superClass != null && superClass != Object.class) {System.out.print(" extends " + superClass.getName());}System.out.println("\n{");printConstructors(cl);System.out.println();printMethods(cl);System.out.println();printFields(cl);System.out.println("}");} catch (ClassNotFoundException e) {e.printStackTrace();}}/*** printConstructors 方法打印类的构造函数信息。* 使用 cl.getDeclaredConstructors() 获取所有构造函数。* 遍历每个构造函数,获取其修饰符、名称和参数类型。* 打印构造函数的修饰符、名称和参数列表。* @param cl*/public static void printConstructors(Class<?> cl) {Constructor<?>[] constructors = cl.getDeclaredConstructors();for (Constructor<?> c : constructors) {String name = c.getName();String modifiers = Modifier.toString(c.getModifiers());System.out.print("  ");if (modifiers.length() > 0) {System.out.print(modifiers + " ");}System.out.print(name + "(");Class<?>[] paramTypes = c.getParameterTypes();for (int i = 0; i < paramTypes.length; i++) {if (i > 0) {System.out.print(", ");}System.out.print(paramTypes[i].getName());}System.out.println(");");}}/*** printMethods 方法打印类的方法信息。* 使用 cl.getDeclaredMethods() 获取所有方法。* 遍历每个方法,获取其修饰符、返回类型、名称和参数类型。* 打印方法的修饰符、返回类型、名称和参数列表。* @param cl*/public static void printMethods(Class<?> cl) {Method[] methods = cl.getDeclaredMethods();for (Method method : methods) {Class<?> returnType = method.getReturnType();String name = method.getName();String modifiers = Modifier.toString(method.getModifiers());System.out.print("  ");if (modifiers.length() > 0) {System.out.print(modifiers + " ");}System.out.print(returnType.getName() + " " + name + "(");Class<?>[] paramTypes = method.getParameterTypes();for (int i = 0; i < paramTypes.length; i++) {if (i > 0) {System.out.print(", ");}System.out.print(paramTypes[i].getName());}System.out.println(");");}}/*** printFields 方法打印类的字段信息。* 使用 cl.getDeclaredFields() 获取所有字段。* 遍历每个字段,获取其修饰符、类型和名称。* 打印字段的修饰符、类型和名称。* 以上代码整体上实现了动态加载类,并输出类的构造函数、方法和字段的信息。* @param cl*/public static void printFields(Class<?> cl) {Field[] fields = cl.getDeclaredFields();for (Field f : fields) {Class<?> type = f.getType();String name = f.getName();String modifiers = Modifier.toString(f.getModifiers());System.out.print("  ");if (modifiers.length() > 0) {System.out.print(modifiers + " ");}System.out.println(type.getName() + " " + name + ";");}}
}

 这个测试案例可以利用反射打印出一个类的所有信息和属性。

测试输出结果

请输入类名(如:java.util.Date):
java.util.Date
public class java.util.Date
{public java.util.Date(int, int, int, int, int, int);public java.util.Date(java.lang.String);public java.util.Date();public java.util.Date(long);public java.util.Date(int, int, int);public java.util.Date(int, int, int, int, int);public boolean after(java.util.Date);public boolean before(java.util.Date);public boolean equals(java.lang.Object);public java.lang.String toString();public int hashCode();public java.lang.Object clone();public int compareTo(java.util.Date);public volatile int compareTo(java.lang.Object);private void readObject(java.io.ObjectInputStream);private void writeObject(java.io.ObjectOutputStream);private final sun.util.calendar.BaseCalendar$Date normalize(sun.util.calendar.BaseCalendar$Date);private final sun.util.calendar.BaseCalendar$Date normalize();public static long parse(java.lang.String);public static java.util.Date from(java.time.Instant);public long getTime();public void setTime(long);public int getDate();public static long UTC(int, int, int, int, int, int);private static final java.lang.StringBuilder convertToAbbr(java.lang.StringBuilder, java.lang.String);private final sun.util.calendar.BaseCalendar$Date getCalendarDate();private static final sun.util.calendar.BaseCalendar getCalendarSystem(int);private static final sun.util.calendar.BaseCalendar getCalendarSystem(sun.util.calendar.BaseCalendar$Date);private static final sun.util.calendar.BaseCalendar getCalendarSystem(long);public int getDay();public int getHours();private static final synchronized sun.util.calendar.BaseCalendar getJulianCalendar();static final long getMillisOf(java.util.Date);public int getMinutes();public int getMonth();public int getSeconds();private final long getTimeImpl();public int getTimezoneOffset();public int getYear();public void setDate(int);public void setHours(int);public void setMinutes(int);public void setMonth(int);public void setSeconds(int);public void setYear(int);public java.lang.String toGMTString();public java.time.Instant toInstant();public java.lang.String toLocaleString();private static final sun.util.calendar.BaseCalendar gcal;private static sun.util.calendar.BaseCalendar jcal;private transient long fastTime;private transient sun.util.calendar.BaseCalendar$Date cdate;private static int defaultCenturyStart;private static final long serialVersionUID;private static final [Ljava.lang.String; wtb;private static final [I ttb;
}进程已结束,退出代码为 0

相关文章:

Java中的反射是怎么回事?

反射的概念 《Java核心技术》中的定义是这样的&#xff1a;能够分析类能力的程序&#xff0c;就是反射 这就是一个概念&#xff0c;跟java中经常提的问题&#xff1a;对象是什么&#xff1f; 一类问题&#xff0c;简单来说就是将类创建对象的逻辑反过来&#xff0c;由对象获得…...

07 STM32寄存器开发基础-中断编程

文章目录 一、前言二、系列文章三、如何学习?四、单片机的中断知识点4.1 中断的概念4.2 中断服务函数中断服务函数与中断的关系中断服务函数的特点与编写要求中断服务函数的命名规则4.3 超声波测距项目里中断的使用思路超声波测距原理使用中断实现超声波测距硬件连接工作流程具…...

聚簇和非聚簇索引/Btree和B+tree

目录 1、聚簇&#xff08;聚集&#xff09;索引 &#xff08;1&#xff09;特点 &#xff08;2&#xff09;优点 &#xff08;3&#xff09;缺点 2、二级索引&#xff08;辅助索引、非聚簇索引&#xff09; 3、Btree&#xff08;平衡多路查找树&#xff09; 4、Btree 5…...

清华学姐熬夜肝了15天的软件测试面试题出炉(附答案)建议收藏!

一、Web自动化测试 1.Selenium中hidden或者是display &#xff1d; none的元素是否可以定位到&#xff1f; 不能,可以写JavaScript将标签中的hidden先改为0&#xff0c;再定位元素 2.Selenium中如何保证操作元素的成功率&#xff1f;也就是说如何保证我点击的元素一定是可以…...

Docker 安装指南

Docker 安装指南 文章目录 Docker 安装指南1. 卸载旧版2. 配置 Docker 的 YUM 库3. 安装 Docker4. 启动和校验5. 配置镜像加速6. 常见问题和解决方法7. 阅读和资源 Docker 是一个开源的容器化平台&#xff0c;能够让开发者打包应用及其依赖项到一个轻量级的、可移植的容器中。以…...

系统架构设计师 - 知识产权与标准化

知识产权与标准化 知识产权与标准化&#xff08;3分&#xff09;保护范围与对象 ★ ★ ★ ★法律法规 保护期限 ★ ★知识产权人确定 ★ ★ ★ ★侵权判断 ★ ★ ★ ★标准化&#xff08;了解&#xff09;★标准的分类标准的编号 大家好呀&#xff01;我是小笙&#xff0c;本章…...

【Python】Facebook开源时间序列数据预测模型Prophet

文章目录 一、简介二、项目的文件解读三、Prophet类主要方法和参数3.1 主要参数3.2 主要方法 四、用法示例 一、简介 Prophet 是由 Facebook 开发的一个开源工具&#xff0c;用于时间序列数据的预测。它特别适用于处理具有强季节性和趋势的时间序列数据&#xff0c;并且对节假…...

Spring 常用的三种拦截器详解

前言 在开发过程中&#xff0c;我们常常使用到拦截器来处理一些逻辑。最常用的三种拦截器分别是 AOP、 Interceptor 、 Filter&#xff0c;但其实很多人并不知道什么时候用AOP&#xff0c;什么时候用Interceptor&#xff0c;什么时候用Filter&#xff0c;也不知道其拦截顺序&am…...

微前端概念

微前端作用 大型应用程序的拆分独立的前端子应用降低程序复杂性&#xff0c;提高开发效率 微前端能力 js隔离css隔离元素隔离生命周期预加载数据通信应用跳转多层嵌套… 微前端实现方案 IframeSingle-spaQiankunMicro-app Iframe <iframe src"https://www.examp…...

FFmpeg实战 - 解复用解码

文章目录 前置知识音视频基础概念解复用、解码的流程分析FFMPEG有8个常用库 常见音视频格式的介绍aac格式介绍h264格式介绍flv格式介绍mp4格式介绍 FFmpeg解码解封装实战数据包和数据帧&#xff08;AVPacket/AVFrame&#xff09;AVPacket/AVFrame的引用计数问题API介绍注意事项…...

Jmeter混合压测(2407)

一 压测需求&#xff1a; 电商作为服务端&#xff0c;至少需要满足并发量,QPS:100/s,TPS:20/s。例如场景&#xff1a; 电商交易中&#xff0c;商品图片请求量最多&#xff0c;电商服务端需要满足并发请求查询图片信息。各家可能会并发请求同一家电商商品、订单等内容。 二 压…...

Prometheus各类监控及监控指标和告警规则

目录 linux docker监控 linux 系统进程监控 linux 系统os监控 windows 系统os监控 配置文件&告警规则 Prometheus配置文件 node_alert.rules docker_container.rules mysql_alert.rules vmware.rules Alertmanager告警规则 consoul注册服务 Dashboard JSON…...

G120 EPos配置方案及应用场景

EPos功能就是基本定位器功能,它可计算出轴的运行特性,使轴以时间最佳的方式移动到目标位置。EPos功能主要包括:设定值 直接给定(MDI)功能、 选择程序段功能、回参考点功能、点动功能、运行到固定挡块功能。 EPos功能通过处理给定的加速度、速度和位置值生成运行特性曲线,…...

定制化爬虫管理:为企业量身打造的数据抓取方案

在数据驱动的时代&#xff0c;企业如何高效、安全地获取互联网上的宝贵信息&#xff1f;定制化爬虫管理服务应运而生&#xff0c;成为解锁专属数据宝藏的金钥匙。本文将深入探讨定制化爬虫管理如何为企业量身打造数据抓取方案&#xff0c;揭秘其在海量信息中精准捕获价值数据的…...

Javascript面试基础6【每日更新10】

Gulp gulp是前端开发过程中一种基于流的代码构建工具&#xff0c;是自动化项目的构建利器;它不仅能对网站资源进行优化&#xff0c;而且在开发过程中很多重复的任务能够使用正确的工具自动完成 Gulp的核心概念:流 流&#xff0c;简单来说就是建立在面向对象基础上的一种抽象的…...

CTF Web信息搜集 25000字详解

目录 前言信息收集常见信息分类域名信息whois备案CDN子域名解析记录 旁站C段服务器信息端口服务器类型数据库类型waf防火墙 网站信息备份文件备份文件常见的后缀名备份文件常见的文件名gedit备份文件vim备份文件收集方法 敏感目录CMS类型&#xff08;指纹识别&#xff09;探针泄…...

MSPM0G3507之电赛小车

一、前言 本文没什么技术分享&#xff0c;纯聊天。以下内容均为笔者的浅薄理解&#xff0c;有不对的地方还请多多包涵。 二、相关配置 主控单元&#xff1a;MSPM0G3507SPTR&#xff08;48角&#xff09; 编译环境&#xff1a;Keil5.33、5.39&#xff08;推荐&#xff09;都可 …...

linux运维一天一个shell命令之vmstat详解

概念 vmstat 是 Linux 系统中一个非常有用的工具&#xff0c;主要用于报告系统的虚拟内存、进程、CPU 活动和 IO 性能等信息。以下是对 vmstat 工具的详细解释&#xff1a; 基本语法 vmstat [options] [delay [count]]delay&#xff1a;更新的时间间隔&#xff08;以秒为单…...

前端开发调试工具推荐分类整理

具体前往&#xff1a;前端调试工具分类整理汇总...

http协议与nginx

动态页面与静态页面的差别&#xff1a; &#xff08;1&#xff09;URL不同 静态⻚⾯链接⾥没有“?” 动态⻚⾯链接⾥包含“&#xff1f;” &#xff08;2&#xff09;后缀不同 (开发语⾔不同) 静态⻚⾯⼀般以 .html .htm .xml 为后缀 动态⻚⾯⼀般以 .php .jsp .py等为后…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...