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

深入探索 Java 反射机制

文章目录

    • 什么是 Java 反射?
    • 反射的核心类和接口
    • 反射的基本用法
      • 获取 Class 对象的三种方式
      • 创建对象实例
      • 访问字段和方法
      • 调用构造方法
    • 反射的使用场景
    • 注意事项
    • 结语

Java反射(Reflection)是指在运行时获取类的信息,特别是获取其属性、方法、构造函数等信息的能力。它提供了一种机制使得程序可以访问、检测和修改一个运行时的类的属性、方法或接口。

Java 反射机制是 Java 语言中一个强大而灵活的特性,它允许程序在运行时访问和操作类和对象的内部属性。通过反射,开发者可以实现不依赖于具体实现的代码,提高程序的通用性和灵活性。本文将详细介绍 Java 反射的基本概念、核心类库以及使用场景和注意事项。

什么是 Java 反射?

Java 反射是一种动态机制,它允许程序在运行时对于任何类都能够知道这个类的所有属性和方法;对于任何对象,都能够调用它的任何一个方法和属性;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的反射机制。

反射的核心类和接口

Java 反射机制涉及的核心类和接口主要包含在 java.lang.Class 类和 java.lang.reflect 包中:

  • Class: 类的对象表示正在运行的 Java 应用程序中的类和接口。
  • Constructor: 类的对象表示类的构造方法。
  • Method: 类的对象表示类的方法。
  • Field: 类的对象表示类的成员变量。
  • Array: 用于动态创建和访问 Java 数组。

这些核心类其实就是一个普通的类,只不过将Java 中的类,字段和方法抽象了一下而已,比如所有类都有一些属性,方法,名字等属性,所以我们把所有的类抽象一下,抽象成一个Class类,其就是用来描述一个类的信息的。我们可以在运行时获取某个类的各种信息。这就是反射。

反射的基本用法

获取 Class 对象的三种方式

  1. 使用 Class.forName(String className) 静态方法(常用于配置文件,将类名以字符串形式存储)。
  2. 使用 .getClass() 方法(通过对象实例获取)。
  3. 使用 .class 语法(直接通过类名获取,适用于编译时已知)。
Class<?> c1 = Class.forName("java.lang.String");
Class<?> c2 = "Hello, World!".getClass();
Class<?> c3 = String.class;

创建对象实例

Class<?> clazz = Class.forName("java.util.ArrayList");
Object instance = clazz.newInstance();

访问字段和方法

Class<?> clazz = Class.forName("java.util.ArrayList");
Field field = clazz.getDeclaredField("size");
Method method = clazz.getMethod("add", Object.class);Object instance = clazz.newInstance();
method.invoke(instance, "Hello, World!");
int size = (Integer) field.get(instance);

调用构造方法

Constructor<?> constructor = clazz.getConstructor();
Object instance = constructor.newInstance();

反射的使用场景

  • 动态加载类和创建对象:反射常用于框架设计,如 Spring 框架中的依赖注入。
  • 运行时的方法调用:在不知道对象具体类型的情况下,反射可以用来调用其方法。
  • 注解处理:反射可以用来读取注解信息,从而实现特定功能,如序列化、ORM 映射等。

注意事项

  1. 性能开销:反射操作相比直接代码调用有一定的性能开销,因为它需要在运行时解析类的信息。
  2. 安全限制:反射可以访问私有成员,但这可能会破坏封装性,需要谨慎使用。
  3. 内部变化风险:使用反射依赖于类的内部结构,如果类的实现改变,反射代码可能会失效。

结语

Java 反射提供了一种强大的机制来动态操作类和对象,它在很多框架和库中都有广泛的应用。但是,反射也应该被谨慎使用,尤其是在性能敏感和安全关键的应用中。理解和掌握 Java 反射机制,可以帮助开发者编写更加灵活和强大的 Java 应用程序。

如果内容有任何问题,欢迎提出!

欢迎大家访问我的个人博客 无限进步的博客

相关文章:

深入探索 Java 反射机制

文章目录 什么是 Java 反射&#xff1f;反射的核心类和接口反射的基本用法获取 Class 对象的三种方式创建对象实例访问字段和方法调用构造方法 反射的使用场景注意事项结语 Java反射&#xff08;Reflection&#xff09;是指在运行时获取类的信息&#xff0c;特别是获取其属性、…...

【ArcGIS Pro微课1000例】0054:Pro3.0创建数据库(文件数据库、移动数据库、企业级数据库)解读

文章目录 一、三种类型数据库解读二、三种类型数据库创建1. 文件数据库2. 移动数据库3. 企业级数据库三、注意事项一、三种类型数据库解读 ArcGIS Pro中主要有三种数据库类型,它们分别是:文件地理数据库、移动地理数据库和企业级地理数据库。它们的区别如下: 存储方式:文件…...

【漏洞复现】华脉智联指挥调度平台命令执行漏洞

Nx01 产品简介 深圳市华脉智联科技有限公司&#xff0c;融合通信系统将公网集群系统、专网宽带集群系统、不同制式、不同频段的短波/超短波对讲、模拟/数字集群系统、办公电话系统、广播系统、集群单兵视频、视频监控系统、视频会议系统等融为一体&#xff0c;集成了专业的有线…...

leetcode第119场双周赛 - 2023 - 12 - 9

比赛地址 : https://leetcode.cn/contest/biweekly-contest-119/ t1 : 直接哈希表 加 暴力 统计就行了 class Solution { public:vector<int> findIntersectionValues(vector<int>& nums1, vector<int>& nums2) {unordered_map<int,int>…...

05. 函数式编程

目录 1、前言 2、什么是函数式编程 2.1、函数是一等公民 2.2、避免状态和可变数据 3、函数式编程的核心概念 3.1、高阶函数 3.2、Lambda&#xff08;匿名函数&#xff09; 3.3、递归 & 尾递归优化 3.4、functools模块 3.4.1、partial 3.4.2、reduce 3.4.3、lru_…...

Linux权限(用户角色+文件权限属性)

Linux权限 文章目录 Linux权限一.文件权限1.快速掌握修改权限的方法&#xff08;修改文件权限属性&#xff09;2.对比权限的有无&#xff0c;以及具体的体现3.修改权限的第二套方法&#xff08;修改用户角色&#xff09;4.文件类型&#xff08;Linux下一切皆文件&#xff09; 二…...

短波红外相机的原理及应用场景

短波红外 (简称SWIR&#xff0c;通常指0.9~1.7μm波长的光线) 是一种比可见光波长更长的光。这些光不能通过“肉眼”看到&#xff0c;也不能用“普通相机”检测到。由于被检测物体的材料特性&#xff0c;一些在可见光下无法看到的特性&#xff0c;却能在近红外光下呈现出来&…...

【PyTorch】softmax回归

文章目录 1.理论介绍2. 代码实现2.1. 主要代码2.2. 完整代码2.3. 输出结果 3. Q&A3.1. 运行过程中出现以下警告&#xff1a;3.2. 定义的神经网络中的nn.Flatten()的作用是什么&#xff1f;3.3. num_workers有什么作用&#xff1f;它的值怎么确定&#xff1f; 1.理论介绍 背…...

12.8 作业 C++

使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否为…...

10.机器人系统仿真(urdf集成gazebo、rviz)

目录 1 机器人系统仿真的必要性与本篇学习目的 1.1 机器人系统仿真的必要性 1.2 一些概念 URDF是 Unified Robot Description Format 的首字母缩写&#xff0c;直译为统一(标准化)机器人描述格式&#xff0c;可以以一种 XML 的方式描述机器人的部分结构&#xff0c;比如底盘…...

城市基础设施智慧路灯改造的特点

智慧城市建设稳步有序推进。作为智慧城市的基础设施&#xff0c;智能照明是智慧城市的重要组成部分&#xff0c;而叁仟智慧路灯是智慧城市理念下的新产品。随着物联网和智能控制技术的飞速发展&#xff0c;路灯被赋予了新的任务和角色。除了使道路照明智能化和节能化外&#xf…...

配置BFD多跳检测示例

BFD简介 定义 双向转发检测BFD&#xff08;Bidirectional Forwarding Detection&#xff09;是一种全网统一的检测机制&#xff0c;用于快速检测、监控网络中链路或者IP路由的转发连通状况。 目的 为了减小设备故障对业务的影响&#xff0c;提高网络的可靠性&#xff0c;网…...

爬虫学习-基础库的使用(requests)

目录 一、安装以及实例引入 &#xff08;1&#xff09;requests库下载 &#xff08;2&#xff09;实例测试 二、GET请求 &#xff08;1&#xff09;基本实例 &#xff08;2&#xff09;抓取网页 &#xff08;3&#xff09;抓取二进制数据 &#xff08;4&#xff09;添…...

4.8 构建onnx结构模型-Less

前言 构建onnx方式通常有两种&#xff1a; 1、通过代码转换成onnx结构&#xff0c;比如pytorch —> onnx 2、通过onnx 自定义结点&#xff0c;图&#xff0c;生成onnx结构 本文主要是简单学习和使用两种不同onnx结构&#xff0c; 下面以 Less 结点进行分析 方式 方法一&a…...

Java调试技巧之垃圾回收机制解析

Java作为一种高级编程语言&#xff0c;以其跨平台、面向对象、自动内存管理等特性而广受开发者的喜爱。其中&#xff0c;自动内存管理是Java的一大亮点&#xff0c;通过垃圾回收机制实现对内存的自动分配和释放&#xff0c;极大地简化了开发者的工作。本文将深入探讨Java的垃圾…...

logstash插件简单介绍

logstash插件 输入插件(input) Input&#xff1a;输入插件。 Input plugins | Logstash Reference [8.11] | Elastic 所有输入插件都支持的配置选项 SettingInput typeRequiredDefaultDescriptionadd_fieldhashNo{}添加一个字段到一个事件codeccodecNoplain用于输入数据的…...

联邦多任务蒸馏助力多接入边缘计算下的个性化服务 | TPDS 2023

联邦多任务蒸馏助力多接入边缘计算下的个性化服务 | TPDS 2023 随着移动智能设备的普及和人工智能技术的发展,越来越多的分布式数据在终端被产生与收集&#xff0c;并以多接入边缘计算(MEC)的形式进行处理和分析。但是由于用户的行为模式与服务需求的多样,不同设备上的数据分布…...

【python爬虫】设计自己的爬虫 3. 文件数据保存封装

考虑到爬取的多媒体文件要保存到本地&#xff0c;因此封装了一个类来专门处理这样的问题&#xff0c;下面看代码&#xff1a; class FileStore:def __init__(self, file_path, read_file_moder,write_file_modewb):"""初始化 FileStore 实例Parameters:- file_…...

pta模拟题——7-34 刮刮彩票

“刮刮彩票”是一款网络游戏里面的一个小游戏。如图所示&#xff1a; 每次游戏玩家会拿到一张彩票&#xff0c;上面会有 9 个数字&#xff0c;分别为数字 1 到数字 9&#xff0c;数字各不重复&#xff0c;并以 33 的“九宫格”形式排布在彩票上。 在游戏开始时能看见一个位置上…...

【补题】 1

蓝桥杯小白赛 ​​​​​​​3.小蓝的金牌梦【算法赛】 - 蓝桥云课 (lanqiao.cn) 数组长度为质数&#xff0c;最大的子数组和 素数 前缀和 #include "bits/stdc.h" using namespace std; #define int long long #define N 100010 int ans[N];int s[N];vector&l…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...

GraphRAG优化新思路-开源的ROGRAG框架

目前的如微软开源的GraphRAG的工作流程都较为复杂&#xff0c;难以孤立地评估各个组件的贡献&#xff0c;传统的检索方法在处理复杂推理任务时可能不够有效&#xff0c;特别是在需要理解实体间关系或多跳知识的情况下。先说结论&#xff0c;看完后感觉这个框架性能上不会比Grap…...