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等为后…...

一款国外开发的高质量WordPress下载站模板主题
5play下载站是由国外站长开发的一款WordPress主题,主题简约大方,为v1.8版本, 该主题模板中包含了上千个应用,登录后台以后只需要简单的三个步骤就可以轻松发布apk文章, 我们只需要在WordPress后台中导入该主题就可以…...

Laravel为什么会成为最优雅的PHP框架
Laravel之所以成为最优雅的PHP框架之一,是因为它提供了一系列的优点,包括简洁的语法、强大的功能集、高度模块化和可扩展性、优雅的ORM、内置认证系统、丰富的社区支持和测试友好等。这些优点使得Laravel在PHP框架中脱颖而出,成为了很多开发者的首选框架。 官网:https://l…...

孤儿进程的例子
先让父进程死亡,子进程的父进程会被操作系统管理 先使用gcc编译代码, 执行代码后用 ps -p <进程号> -f 查看进程 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h>int main() {pid_t pid;// 创建…...

CSS前端面试题——怎么用CSS实现一个宽高自适应的正方形?
方法一:使用 padding 方案 这种方法通过设置元素的 padding 属性来实现宽高比例相等的正方形。假设我们希望正方形的边长为相对于父容器的百分比值,比如50% .square {width: 50%; /* 可以是任意宽度,这里假设为父元素宽度的50% */padding-t…...

谷粒商城实战笔记-56~57-商品服务-API-三级分类-修改-拖拽功能完成
文章目录 一,56-商品服务-API-三级分类-修改-拖拽功能完成二,57-商品服务-API-三级分类-修改-批量拖拽效果1,增加按钮2,多次拖拽一次保存完整代码 在构建商品服务API中的三级分类修改功能时,拖拽排序是一个直观且高效的…...

Shader入门精要总结(二)矩阵
1. 矩阵乘法 一个rn的矩阵A和一个nc的矩阵B相乘,它们的结果AB将会是一个rc大小的矩阵,不满足此规则不能相乘 矩阵乘法满足一些性质 矩阵乘法不满足交换律 即AB≠BA矩阵乘法满足结合律 (AB)CA(BC) 2. 特殊矩阵 方块矩阵 指行和列数目相等的矩阵&#…...

基于CentOS Stream 9平台安装MySQL Community Server 9.0.1 Innovation
1. 安装之前 1.1 查看系统版本 cat /etc/redhat-releaseCentOS Stream release 9 1.2 查看cpu架构 lscpu架构: x86_64 CPU 运行模式: 32-bit, 64-bit 2. 官网下载 https://dev.mysql.com/downloads/mysql/ 要多看看 官方9.0文档:https://d…...

正则采集器之五——商品匹配规则
需求设计 实现分析 系统通过访问URL得到html代码,通过正则表达式匹配html,通过反向引用来得到商品的标题、图片、价格、原价、id,这部分逻辑在java中实现。 匹配商品的正则做成可视化编辑,因为不同网站的结构不同,同…...

一键切换阿里yum源(包括其他系统repo镜像查找方法)
一键切换阿里yum源 示例命令其他系统repo镜像GitHub文档 示例命令 # 备份旧源 mv CentOS-Base.repo CentOS-Base.repo.bak # 添加新源(阿里镜像源) wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo其他系统repo镜像 这里的示例是用…...

Fiddler学习笔记
目录 前言 简介 原理 界面 前言 测试可以使用fiddler工具,通过抓包的方式修改前端参数和模拟后端返回,快速定位缺陷。 简介 Fiddler是HTTP协议调试代理工具,可以记录并检查所有客户端和服务器之间的HTTP和HTTPS请求,允许监视…...