当前位置: 首页 > 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…...

BLE协议栈探秘:从ATT属性表到GATT服务树的通信逻辑

1. BLE通信的基础架构&#xff1a;从广播到连接 想象一下你走进一家咖啡馆&#xff0c;手机自动弹出了当前可连接的Wi-Fi列表——这个场景和BLE设备建立连接的过程非常相似。BLE&#xff08;蓝牙低功耗&#xff09;技术之所以能成为物联网设备的标配&#xff0c;关键在于它精巧…...

小心数据被‘卷’没!玩转24C02页写时必须搞懂的地址翻转与边界检查

小心数据被‘卷’没&#xff01;玩转24C02页写时必须搞懂的地址翻转与边界检查 在嵌入式开发中&#xff0c;I2C EEPROM存储器的使用频率极高&#xff0c;而24C02作为经典型号&#xff0c;其页写功能既能提升效率又暗藏风险。许多开发者都曾遭遇过这样的噩梦&#xff1a;明明写入…...

5个维度重构交易决策:如何构建下一代几何交易系统

5个维度重构交易决策&#xff1a;如何构建下一代几何交易系统 【免费下载链接】chanvis 基于TradingView本地SDK的可视化前后端代码&#xff0c;适用于缠论量化研究&#xff0c;和其他的基于几何交易的量化研究。 缠论量化 摩尔缠论 缠论可视化 TradingView TV-SDK 项目地址:…...

手势识别实战:从Light-HaGRID轻量数据集到多平台部署

1. 手势识别与Light-HaGRID数据集入门 第一次接触手势识别项目时&#xff0c;我被海量数据需求吓到了。直到发现Light-HaGRID这个轻量数据集&#xff0c;才明白原来入门可以这么简单。这个数据集最吸引我的地方在于&#xff0c;它把原始716GB的HaGRID数据压缩到18GB&#xff0…...

3个场景解锁抖音下载器:从零开始掌握高效素材收集

3个场景解锁抖音下载器&#xff1a;从零开始掌握高效素材收集 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. …...

**发散创新:过度依赖单一编程语言导致的架构风险与重构实践**在现代软件开发中,**选择一种编程语言并深度

发散创新&#xff1a;过度依赖单一编程语言导致的架构风险与重构实践 在现代软件开发中&#xff0c;选择一种编程语言并深度绑定其生态已成为许多团队的默认策略。然而&#xff0c;这种“技术栈锁定”现象正悄然埋下隐患——一旦该语言在特定场景下表现乏力、维护成本飙升或社区…...

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

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

激活函数选型指南:从ReLU到RReLU,如何根据你的数据集大小和任务特性做选择?

激活函数实战选型手册&#xff1a;从ReLU到RReLU的深度决策框架 在深度学习模型构建过程中&#xff0c;激活函数的选择往往被当作一个默认参数处理——大多数人会不假思索地选择ReLU。但当我们面对特定任务时&#xff0c;这种"一刀切"的做法可能让模型性能大打折扣。…...

米哈游游戏启动器终极指南:如何用Starward一站式管理你的游戏世界

米哈游游戏启动器终极指南&#xff1a;如何用Starward一站式管理你的游戏世界 【免费下载链接】Starward Game Launcher for miHoYo - 米家游戏启动器 项目地址: https://gitcode.com/gh_mirrors/st/Starward 还在为管理多个米哈游游戏而烦恼吗&#xff1f;每次都要打开…...

终极指南:3步让旧Mac焕发新生,OpenCore Legacy Patcher完整使用教程

终极指南&#xff1a;3步让旧Mac焕发新生&#xff0c;OpenCore Legacy Patcher完整使用教程 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为旧款Mac无法…...