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核心技术》中的定义是这样的:能够分析类能力的程序,就是反射 这就是一个概念,跟java中经常提的问题:对象是什么? 一类问题,简单来说就是将类创建对象的逻辑反过来,由对象获得…...

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

聚簇和非聚簇索引/Btree和B+tree
目录 1、聚簇(聚集)索引 (1)特点 (2)优点 (3)缺点 2、二级索引(辅助索引、非聚簇索引) 3、Btree(平衡多路查找树) 4、Btree 5…...

清华学姐熬夜肝了15天的软件测试面试题出炉(附答案)建议收藏!
一、Web自动化测试 1.Selenium中hidden或者是display = none的元素是否可以定位到? 不能,可以写JavaScript将标签中的hidden先改为0,再定位元素 2.Selenium中如何保证操作元素的成功率?也就是说如何保证我点击的元素一定是可以…...

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

系统架构设计师 - 知识产权与标准化
知识产权与标准化 知识产权与标准化(3分)保护范围与对象 ★ ★ ★ ★法律法规 保护期限 ★ ★知识产权人确定 ★ ★ ★ ★侵权判断 ★ ★ ★ ★标准化(了解)★标准的分类标准的编号 大家好呀!我是小笙,本章…...

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

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

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

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

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

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功能通过处理给定的加速度、速度和位置值生成运行特性曲线,…...

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

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

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

MSPM0G3507之电赛小车
一、前言 本文没什么技术分享,纯聊天。以下内容均为笔者的浅薄理解,有不对的地方还请多多包涵。 二、相关配置 主控单元:MSPM0G3507SPTR(48角) 编译环境:Keil5.33、5.39(推荐)都可 …...
linux运维一天一个shell命令之vmstat详解
概念 vmstat 是 Linux 系统中一个非常有用的工具,主要用于报告系统的虚拟内存、进程、CPU 活动和 IO 性能等信息。以下是对 vmstat 工具的详细解释: 基本语法 vmstat [options] [delay [count]]delay:更新的时间间隔(以秒为单…...

前端开发调试工具推荐分类整理
具体前往:前端调试工具分类整理汇总...

http协议与nginx
动态页面与静态页面的差别: (1)URL不同 静态⻚⾯链接⾥没有“?” 动态⻚⾯链接⾥包含“?” (2)后缀不同 (开发语⾔不同) 静态⻚⾯⼀般以 .html .htm .xml 为后缀 动态⻚⾯⼀般以 .php .jsp .py等为后…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...

wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...

Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...