java反射

article/2025/7/31 13:11:23

简介

在这里插入图片描述

获取Class

在这里插入图片描述

误区

解释一下 “类” 和 “Class对象” 的区别,以及为什么每个类都有关联的 Class 对象:

🧩 核心概念:类 vs Class对象

想象你有一本《汽车使用说明书》:

  • = 这本说明书本身(纸上的文字和图纸)
  • Class对象 = 这本说明书的电子档案(包含所有信息的数字副本)

🌰 实际代码示例

// 1. 定义一个普通类
public class Car {String color;public void drive() {System.out.println("Driving...");}
}// 2. 获取该类的Class对象
public class Main {public static void main(String[] args) {// 方式1:通过类名获取Class<?> carClass1 = Car.class;  // 这就是Car类的"档案袋"// 方式2:通过对象获取Car myCar = new Car();Class<?> carClass2 = myCar.getClass(); // 同一个档案袋System.out.println(carClass1 == carClass2); // 输出 true(同一个对象)// 3. 查看档案袋里的信息System.out.println("类名: " + carClass1.getName());   // 输出: CarSystem.out.println("方法数量: " + carClass1.getMethods().length); // 输出: 所有方法的数量}
}

📦 Class对象到底是什么?

  1. 它是JVM自动创建的
    当Java程序启动时,JVM会为每个加载的类(包括系统类和你自定义的类)自动创建一个特殊的Class类型对象。

  2. 它包含的信息

    包含的内容示例
    类名"Car"
    字段信息color 字段的类型、名称
    方法信息drive() 方法的参数、返回值
    父类信息继承自哪个父类
    注解信息类上的注解标记
    类修饰符public, abstract
  3. 它存放在哪里?

    • 存放在JVM的方法区(Method Area)中
    • 每个类只有一个对应的Class对象(单例)

🔍 为什么需要Class对象?

  1. 反射机制的基础
    让程序在运行时能"查看"类的结构:

    // 动态获取类信息(无需知道具体类)
    Class<?> unknownClass = Class.forName("com.example.UnknownClass");
    Method[] methods = unknownClass.getMethods(); // 获取所有方法
    
  2. 类型检查

    if(obj.getClass() == Car.class) {System.out.println("这是一个Car对象");
    }
    
  3. 框架设计的核心
    Spring、Hibernate等框架都依赖Class对象来:

    • 动态创建对象
    • 自动注入依赖
    • 处理注解配置

🆚 关键区别总结

普通类 (如Car)Class对象 (如Car.class)
本质你写的代码(模板)JVM创建的元数据对象
创建由开发者定义由JVM自动创建
内容字段/方法的实现类的描述信息(元数据)
用途创建对象 (new Car())反射操作 (getMethods())
位置源代码文件 (.java)JVM内存中

💡 生活化比喻

想象一家汽车工厂:

  • = 汽车设计图纸(定义如何造车)
  • Class对象 = 工厂的物料清单(记录需要多少轮胎、发动机型号等)
  • 对象 = 实际造出来的汽车(根据图纸生产的实体)

每个设计图纸(类)在工厂(JVM)中都有对应的物料清单(Class对象),这样工厂才能知道如何正确生产汽车(对象)。

这种机制是Java反射能力的核心基础,让程序能在运行时动态了解和处理类信息。

反射获取类中的成分并操作

成员方法

在这里插入图片描述

构造器

在这里插入图片描述

成员变量

在这里插入图片描述

作用

在这里插入图片描述

破坏封装性

被private的依旧可以通过暴力反射操作。

破坏泛型的约束性

在这里插入图片描述
原本只可以加String,用反射之后就可以add其他类型的变量。


http://www.hkcw.cn/article/ZLQvCAJqwX.shtml

相关文章

C++ 之 多态 【虚函数表、多态的原理、动态绑定与静态绑定】

目录 前言 1.多态的原理 1.1虚函数表 1.2派生类中的虚表 1.3虚函数、虚表存放位置 1.4多态的原理 1.5多态条件的思考 2.动态绑定与静态绑定 3.单继承和虚继承中的虚函数表 3.1单继承中的虚函数表 3.2多继承(非菱形继承)中的虚函数表 4.问答题 前言 需要声明的&#x…

28 C 语言作用域详解:作用域特性(全局、局部、块级)、应用场景、注意事项

1 作用域简介 作用域定义了代码中标识符&#xff08;如变量、常量、数组、函数等&#xff09;的可见性与可访问范围&#xff0c;即标识符在程序的哪些位置能够被引用或访问。在 C 语言中&#xff0c;作用域主要分为三类&#xff1a; 全局作用域局部作用域块级作用域 需注意&am…

day03-Vue-Element

1 Ajax 1.1 Ajax介绍 1.1.1 Ajax概述 我们前端页面中的数据&#xff0c;如下图所示的表格中的学生信息&#xff0c;应该来自于后台&#xff0c;那么我们的后台和前端是互不影响的2个程序&#xff0c;那么我们前端应该如何从后台获取数据呢&#xff1f;因为是2个程序&#xf…

智慧交通设计方案

该文档是智慧交通设计方案,交通设计位于综合交通规划后、道路工程设计前,目标是优化交通系统及设施,实现交通安全、高效、可持续发展。内容涵盖区域交通组织优化(含需求管理、速度管理等)、平面交叉口设计(要素、改善措施)、专项交通设计(公共交通、慢行系统等)、智能…

SAP学习笔记 - 开发17 - 前端Fiori开发 Component 配置(组件化)

上一章讲了Fiori前端开发中的国际化。 SAP学习笔记 - 开发16 - 前端Fiori开发 Properties文件&#xff08;国际化&#xff09; &#xff0c;语言切换实例&#xff0c;Fiori 国际化&#xff08;常用语言列表&#xff0c;关键规则&#xff0c;注意事项&#xff09;-CSDN博客 本…

leetcode刷题日记——二叉树的层平均值

[ 题目描述 ]&#xff1a; [ 思路 ]&#xff1a; BFS&#xff0c;通过层次遍历求得每层的和&#xff0c;然后取平均数&#xff0c;存入结果数组树中节点个数在1-10000之间&#xff0c;那么结果数组最大为10000个结果&#xff0c;层数最多为 2n-1>10000&#xff0c;可以推…

Google Android 14设备和应用通知 受限制的设置 出于安全考虑......

重要提示&#xff1a; 文中部分步骤仅适用于 Android 13 及更高版本。了解如何查看 Android 版本。 启用受限制的设置后&#xff0c;应用将能够访问敏感信息&#xff0c;而这可能使您的个人数据面临风险。除非您信任该应用的开发者&#xff0c;否则我们不建议您允许访问受限制…

【小米拥抱AI】小米开源视觉大模型—— MiMo-VL

MiMo-VL-7B模型的开发包含两个序贯训练过程&#xff1a;&#xff08;1&#xff09;四阶段预训练&#xff0c;涵盖投影器预热、视觉-语言对齐、通用多模态预训练及长上下文监督微调&#xff08;SFT&#xff09;&#xff0c;最终生成MiMo-VL-7B-SFT模型&#xff1b;&#xff08;2…

自编码器Auto-encoder(李宏毅)

目录 编码器的概念&#xff1a; 为什么需要编码器&#xff1f; 编码器什么原理&#xff1f; 去噪自编码器: 自编码器的应用&#xff1a; 特征解耦 离散隐表征 编码器的概念&#xff1a; 重构&#xff1a;输入一张图片&#xff0c;通过编码器转化成向量&#xff0c;要求再…

Claude 4 升级:从问答助手到任务执行者 | AI大咖说

Claude 4 升级&#xff1a;从问答助手到任务执行者 Claude 4 升级历程 2025-05-22日&#xff0c;Anthropic 正式发布了他们的新 AI 模型 Claude 4。这标志着 AI 不再仅仅是一个智能问答系统&#xff0c;而是开始具备独立完成复杂任务的能力。CEO Dario Amodei 在发布会中强调…

Day42 Python打卡训练营

知识点回顾 1.回调函数 2.lambda函数 3.hook函数的模块钩子和张量钩子 4.Grad-CAM的示例 作业&#xff1a;理解下今天的代码即可 1.回调函数 Hook本质是回调函数&#xff0c;所以我们先介绍一下回调函数 回调函数是作为参数传递给其他函数的函数&#xff0c;其目的是在某个特…

2002-2022年 城市市政公用设施水平、环境、绿地等数据-社科经管实证数据

2002-2022年城市市政公用设施水平、环境、绿地等数据-社科经管https://download.csdn.net/download/paofuluolijiang/90880456 https://download.csdn.net/download/paofuluolijiang/90880456 《2002-2022年城市市政公用设水平、环境、绿地等数据-社科经管实证数据》整理自多源…

uni-app学习笔记十七-css和scss的使用

SCSS 和 CSS的异同点 我们可以使用css和scss来设置样式。其中SCSS&#xff08;Sassy CSS&#xff09;是 CSS 预处理器 Sass&#xff08;Syntactically Awesome Stylesheets&#xff09;的一种语法格式&#xff0c;而 CSS&#xff08;Cascading Style Sheets&#xff09;是标准…

达梦分布式集群DPC_分布式事务理解_yxy

达梦分布式集群DPC_分布式事务理解 1 分布式事务是什么&#xff1f;2 分布式事务怎么实现&#xff1f;2.1 两阶段提交保障一致性2.1.1 预提交2.1.2 提交 2.2 RAFT协议保障数据强一致2.3 全局事务管理2.3.1 全局事务信息的登记流程2.3.2 数据可见性判断规则 1 分布式事务是什么&…

性能优化 - 案例篇:缓冲区

文章目录 Pre1. 引言2. 缓冲概念与类比3. Java I/O 中的缓冲实现3.1 FileReader vs BufferedReader&#xff1a;装饰者模式设计3.2 BufferedInputStream 源码剖析3.2.1 缓冲区大小的权衡与默认值 4. 异步日志中的缓冲&#xff1a;Logback 异步日志原理与配置要点4.1 Logback 异…

【目标检测】检测网络中neck的核心作用

1. neck最主要的作用就是特征融合&#xff0c;融合就是将具有不同大小感受野的特征图进行了耦合&#xff0c;从而增强了特征图的表达能力。 2. neck决定了head的数量&#xff0c;进而潜在决定了不同尺度样本如何分配到不同的head&#xff0c;这一点可以看做是将整个网络的多尺…

基于机器学习的心脏病预测模型构建与可解释性分析

一、引言 心脏病是威胁人类健康的重要疾病之一&#xff0c;早期预测和诊断对防治心脏病具有重要意义。本文利用公开的心脏病数据集&#xff0c;通过机器学习算法构建预测模型&#xff0c;并使用 SHAP 值进行模型可解释性分析&#xff0c;旨在为心脏病的辅助诊断提供参考。 二、…

每日算法-250601

每日算法 - 250601 记录今天完成的算法题目。 1. 1749. 任意子数组和的绝对值的最大值 题目描述 思路 前缀和 解题过程 子数组的和 sum(nums[i..j]) 可以通过前缀和 prefixSum[j] - prefixSum[i-1] 来计算&#xff08;规定 prefixSum[-1] 0&#xff09;。 我们要求的是 ab…

算法打开13天

41.前 K 个高频元素 &#xff08;力扣347题&#xff09; 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2]示例 2: 输入: nums [1], k 1 输出: …