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

Java 反射机制实践案例

Java反射机制允许程序在运行时查询和操作对象的类信息,甚至可以调用类的方法、访问字段和创建新的对象。下面通过几个简单的示例来展示Java反射的实践应用。

1. 获取Class对象的引用

有三种主要方式可以在运行时获得Class对象的引用:

// 方法1: 通过对象实例的getClass()方法
MyObject obj = new MyObject();
Class<?> c1 = obj.getClass();// 方法2: 通过类的.class语法
Class<?> c2 = MyObject.class;// 方法3: 通过Class.forName()方法
try {Class<?> c3 = Class.forName("com.example.MyObject");
} catch (ClassNotFoundException e) {e.printStackTrace();
}

2. 创建对象实例

可以通过Class对象创建类的实例:

try {Class<?> clazz = Class.forName("com.example.MyObject");MyObject myObjectInstance = (MyObject) clazz.getDeclaredConstructor().newInstance();
} catch (ClassNotFoundException | NoSuchMethodException | InstantiationException |IllegalAccessException | InvocationTargetException e) {e.printStackTrace();
}

3. 访问字段和方法

可以通过反射来访问对象的字段和方法,包括私有的:

try {// 获取Class对象引用Class<?> clazz = Class.forName("com.example.MyObject");// 创建对象实例MyObject myObjectInstance = (MyObject) clazz.getDeclaredConstructor().newInstance();// 访问字段Field field = clazz.getDeclaredField("myField");field.setAccessible(true); // 对于私有字段,需要调用此方法field.set(myObjectInstance, "newValue"); // 设置字段的值String fieldValue = (String) field.get(myObjectInstance); // 获取字段的值// 调用方法Method method = clazz.getDeclaredMethod("myMethod", String.class);method.setAccessible(true); // 对于私有方法,需要调用此方法String returnValue = (String) method.invoke(myObjectInstance, "parameterValue");} catch (ClassNotFoundException | NoSuchMethodException | InstantiationException |IllegalAccessException | InvocationTargetException | NoSuchFieldException e) {e.printStackTrace();
}

4. 操作数组

反射还可以用来动态地操作数组。

try {int[] intArray = (int[]) Array.newInstance(int.class, 5);Array.set(intArray, 0, 123);Array.set(intArray, 1, 456);Array.set(intArray, 2, 789);int element = Array.getInt(intArray, 0); // 读取数组第一个元素
} catch (IllegalArgumentException e) {e.printStackTrace();
}

5. 获取和操作类的信息

可以使用反射获取类的信息,如方法、字段、注解等。

Class<?> clazz = Class.forName("com.example.MyObject");// 获取所有公共方法
Method[] methods = clazz.getMethods();// 获取所有字段
Field[] fields = clazz.getFields();// 获取所有类注解
Annotation[] annotations = clazz.getAnnotations();

6. 调用私有构造函数

反射可以用来调用私有构造函数创建实例:

Class<?> clazz = Class.forName("com.example.MySecretClass");
Constructor<?> constructor = clazz.getDeclaredConstructor();
constructor.setAccessible(true); // 使私有构造函数可访问
MySecretClass mySecretClassInstance = (MySecretClass) constructor.newInstance();

注意事项

  • 反射的操作通常比直接的Java代码要慢,并且可能违反封装原则。应该谨慎使用,并且只在必要的时候使用。
  • 使用反射时,需要处理许多异常,因为它会抛出很多与反射相关的异常,如IllegalAccessExceptionInstantiationExceptionNoSuchMethodException等。
  • 对于私有成员的操作,需要调用setAccessible(true)来禁止Java的访问控制检查,这可能会引发安全问题。

反射是一个功能强大的机制,它使得Java编程更加灵活。不过,应当注意,滥用反射可能会导致代码难以理解和维护,也可能会引起性能问题。因此,在使用反射时要保持审慎。

相关文章:

Java 反射机制实践案例

Java反射机制允许程序在运行时查询和操作对象的类信息&#xff0c;甚至可以调用类的方法、访问字段和创建新的对象。下面通过几个简单的示例来展示Java反射的实践应用。 1. 获取Class对象的引用 有三种主要方式可以在运行时获得Class对象的引用&#xff1a; // 方法1: 通过对…...

OJ:循环队列

622. 设计循环队列 - 力扣&#xff08;LeetCode&#xff09; 思路 思路&#xff1a;首先循环队列的意思是&#xff1a;空间固定&#xff0c;就是提前开辟好&#xff0c;满了就不能插入了&#xff0c;但是删除数据后仍有空间&#xff0c;删除循环队列里面的数据后&#xff0c;保…...

专业140+总430+电子科技大学858信号与系统考研经验成电电子信息与通信工程,电科大,真题,大纲,参考书。

今年考研成绩出来&#xff0c;初试专业课858信号与系统140&#xff0c;总分430&#xff0c;其余各门分数都比较平稳&#xff0c;总分好于自己估分&#xff0c;应群里很多同学要求&#xff0c;我总结一下自己的复习经验。首先我是一个大冤种&#xff0c;专业课资料学长给了一套&…...

C++:STL - set map

C&#xff1a;STL - set & map 关联式容器pairset模板参数typedef的类型构造函数迭代器常规接口特殊接口 multisetmap模板参数typedef的类型常规接口特殊接口 multimap 关联式容器 关联式容器是C标准库提供的一种数据结构&#xff0c;用于存储操作键值对&#xff08;key-v…...

一招鲜吃遍天之Haproxy集群

四层&#xff1a; LVS&#xff1a;Linux Virtual Server Nginx&#xff1a; HAProxy&#xff1a;High Availability Proxy 七层: HAProxy Nginx 硬件&#xff1a; F5 F5 | 多云安全和应用交付 Netscaler NetScaler: Application Delivery at Scale Array 北京华耀科技…...

数据库的筛选条件

【一】筛选过滤条件 【1】完整的查询语句 -- 查询当前表中的全部数据select * from 表名 where 筛选条件;​-- 查询当前表中的指定字段的数据select 字段名,字段名 from 表名 where 筛选条件;# 执行顺序from where select ​select 你选择的列1, 你选择的列2, ... from 查询的…...

MySQL学习笔记(一)数据库事务隔离级别与多版本并发控制(MVCC)

一、数据库事务隔离级别 数据库事务的隔离级别有4种&#xff0c;由低到高分别为Read uncommitted &#xff08;读未提交&#xff09;、Read committed&#xff08;读提交&#xff09; 、Repeatable read&#xff08;可重复读&#xff09; 、Serializable &#xff08;串行化&a…...

如何在Linux上为PyCharm创建和配置Desktop Entry

在Linux操作系统中&#xff0c;.desktop 文件是一种桌面条目文件&#xff0c;用于在图形用户界面中添加程序快捷方式。本文将指导您如何为PyCharm IDE创建和配置一个 .desktop 文件&#xff0c;从而能够通过应用程序菜单或桌面图标快速启动PyCharm。 步骤 1: 确定PyCharm安装路…...

Igraph入门指南 4

二、图的创建 图分有向图和无向图&#xff0c;所以图的创建有各自的实现方式。 1、手工创建图&#xff1a; 1-1 通过文本创建&#xff1a;graph_from_literal 通过每项提供两个顶点名&#xff08;或ID号&#xff09;作为一条边的格式&#xff0c;手动创建图&#xff0c;顶点…...

外包干了30天,技术明显退步。。

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 这次来聊一个大家可能也比较关心的问题&#xff0c;那就是就业城市选择的问题。而谈到这个问题&a…...

数据库 — 增删查改

一、操作数据库、表 显示 show databases;创建 create database xxx;使用 use xxx; 删除 drop database xxx;查看表&#xff1b; show tables; 查看表结构 desc 表名; 创建 create table 表名(字段1 类型1&#xff0c;字段2 类型2&#xff0c;.... ); 删除 drop table 表名; 二…...

eclipse搭建java web项目

准备条件 eclipsejdk1.8 &#xff08;配置jdk环境&#xff09;apache-tomcat-8.5.97&#xff08;记住安装位置&#xff09; 一 点击完成 开始创建javaweb项目 import java.io.IOException; import java.io.PrintWriter;import javax.servlet.ServletException; import javax.s…...

gitlab-ci_cd语法CICD

工作原理 1、将代码托管在git 2、在项目根目录创建ci文件.gitlan-ci.yml 在文件中指定构建&#xff0c;测试和部署脚本 3、gitlab将检测到他并使用名为git Runner的工具运行脚本 4、脚本被分组为作业&#xff0c;他们共同组成了一个管道gitlab-ci的脚本执行&#xff0c;需要自…...

python 蓝桥杯之动态规划入门

文章目录 DFS滑行&#xff08;DFS 记忆搜索&#xff09; 思路&#xff1a; 要思考回溯怎么写&#xff08;入参与返回值、递归到哪里&#xff0c;递归的边界和入口&#xff09; DFS 滑行&#xff08;DFS 记忆搜索&#xff09; 代码分析&#xff1a; 学会将输入的数据用二维列表…...

[LeetCode][102]二叉树的层序遍历——遍历结果中每一层明显区分

题目 102. 二叉树的层序遍历 给定二叉树的根节点 root&#xff0c;返回节点值的层序遍历结果。即逐层地&#xff0c;从左到右访问所有节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]] 示例 2&#xff1a; 输入…...

GIS之深度学习10:运行Faster RCNN算法

&#xff08;未完成&#xff0c;待补充&#xff09; 获取Faster RCNN源码 &#xff08;开源的很多&#xff0c;论文里也有&#xff0c;在这里不多赘述&#xff09; 替换自己的数据集&#xff08;图片标签文件&#xff09; &#xff08;需要使用labeling生成标签文件&#xf…...

appium2的一些配置

appium-desktop不再维护之后&#xff0c;需要使用appium2。 1、安装appium2 命令行输入npm i -g appium。安装之后输入appium或者appium-server即可启动appium 2、安装安卓/ios的驱动 安卓&#xff1a;appium driver install uiautomator2 iOS&#xff1a;appium driver i…...

基于springboot+vue实现高校学生党员发展管理系统项目【项目源码+论文说明】

基于springboot实现高校学生党员发展管理系统演示 摘要 随着高校学生规模的不断扩大&#xff0c;高校内的党员统计及发展管理工作面临较大的压力&#xff0c;高校信息化建设的不断优化发展也进一步促进了系统平台的应用&#xff0c;借助系统平台可以实现更加高效便捷的党员信息…...

Java代码审计安全篇-常见Java SQL注入

前言&#xff1a; 堕落了三个月&#xff0c;现在因为被找实习而困扰&#xff0c;着实自己能力不足&#xff0c;从今天开始 每天沉淀一点点 &#xff0c;准备秋招 加油 注意&#xff1a; 本文章参考qax的网络安全java代码审计&#xff0c;记录自己的学习过程&#xff0c;还希望…...

C#实现快速排序算法

C#实现快速排序算法 以下是C#中的快速排序算法实现示例&#xff1a; using System;class QuickSort {// 快速排序入口函数public static void Sort(int[] array){QuickSortRecursive(array, 0, array.Length - 1);}// 递归函数实现快速排序private static void QuickSortRecu…...

Android 14 Camera CTS通关避坑指南:从FOV校准到HeifWriter的12个实战问题修复

Android 14 Camera CTS实战全解析&#xff1a;从FOV校准到HEIF写入的深度排错手册 在手机厂商的Camera HAL开发中&#xff0c;CTS认证是产品上市前必须跨越的技术门槛。面对Android 14带来的新测试项和更严格的验证标准&#xff0c;开发团队常常需要在极短时间内解决从底层驱动…...

时间序列模型选型指南:AR、MA、ARMA、ARIMA到底该用哪个?结合销售预测与服务器监控案例讲清楚

时间序列模型选型实战&#xff1a;从销售预测到服务器监控的决策逻辑 当业务团队甩来一份历史销售数据要求预测下季度业绩&#xff0c;或是运维部门急需根据服务器日志预测潜在故障时&#xff0c;许多技术决策者会陷入选择困难——AR、MA、ARMA、ARIMA这些字母组合究竟意味着什…...

天赐范式第16天:【硬核反骨】哥本哈根沉默:REM睡眠是大脑在50维相空间的“超决定论”搜索(附Python源码)

摘要&#xff1a;梦境不是随机的噪声&#xff0c;而是意识在混沌边缘的精确计算。本文基于 Kuramoto 高维耦合振子模型&#xff0c;利用纯 Python (NumPy) 模拟了快速动眼期&#xff08;REM&#xff09;的神经动力学。实验发现&#xff1a;系统在 李雅普诺夫指数 λ0.0086 的弱…...

AzurLaneAutoScript技术深度解析:通过图像识别与自动化架构实现多服务器游戏自动化

AzurLaneAutoScript技术深度解析&#xff1a;通过图像识别与自动化架构实现多服务器游戏自动化 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研&#xff0c;全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLa…...

Qwen3-14B赋能内容创作团队:私有部署后批量生成营销文案实战案例

Qwen3-14B赋能内容创作团队&#xff1a;私有部署后批量生成营销文案实战案例 1. 营销文案创作的痛点与解决方案 在当今快节奏的数字营销环境中&#xff0c;内容创作团队面临着巨大压力。每天需要产出大量高质量的营销文案&#xff0c;包括产品描述、社交媒体帖子、广告文案等…...

如何免费解锁VMware的macOS虚拟化限制:完整技术解析与实践指南

如何免费解锁VMware的macOS虚拟化限制&#xff1a;完整技术解析与实践指南 【免费下载链接】unlocker VMware Workstation macOS 项目地址: https://gitcode.com/gh_mirrors/un/unlocker 引言&#xff1a;跨越平台壁垒的技术桥梁 在虚拟化技术日益成熟的今天&#xff…...

告别连线噩梦:用SV的interface和modport重构你的UVM验证平台连接

告别连线噩梦&#xff1a;用SV的interface和modport重构你的UVM验证平台连接 在构建复杂UVM验证环境时&#xff0c;工程师们常常陷入信号连线的泥潭。每当DUT接口增减一个信号&#xff0c;就需要在多个模块中同步修改端口定义——这种重复劳动不仅低效&#xff0c;还容易引入连…...

BepInEx终极指南:快速掌握Unity游戏模组开发框架

BepInEx终极指南&#xff1a;快速掌握Unity游戏模组开发框架 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx BepInEx是Unity游戏模组开发的终极框架&#xff0c;让你轻松为喜爱的游…...

【SITS2026机密白皮书】:为什么83%的企业在AI扫描中仍依赖人工复核?3类不可绕过的语义盲区正在吞噬DevSecOps效能

第一章&#xff1a;SITS2026分享&#xff1a;AI代码安全扫描 2026奇点智能技术大会(https://ml-summit.org) 在SITS2026大会上&#xff0c;多家头部安全厂商与开源社区联合发布了新一代AI驱动的代码安全扫描框架——SentryLLM&#xff0c;该框架深度融合大语言模型语义理解能…...

炉石传说高级插件开发实战指南:构建强大游戏增强工具

炉石传说高级插件开发实战指南&#xff1a;构建强大游戏增强工具 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod HsMod是基于BepInEx框架的炉石传说多功能增强插件&#xff0c;为技术爱好者…...