Java 反射
一、基本概念
Java反射机制是Java语言的一种动态特性,允许程序在运行时检查和操作类、接口、字段和方法。反射机制使得Java程序可以在运行时获取关于类的详细信息,并且可以动态地调用类的方法、访问类的字段等。反射机制主要涉及以下几个核心类和接口:
-
Class类:每个Java类都有一个对应的Class对象,Class对象包含了与类相关的所有信息。
主要方法: getFields():获取所有公共字段。 getDeclaredFields():获取所有声明的字段,包括私有字段。 getMethods():获取所有公共方法。 getDeclaredMethods():获取所有声明的方法,包括私有方法。 getConstructors():获取所有公共构造函数。 getDeclaredConstructors():获取所有声明的构造函数,包括私有构造函数。 getSuperclass():获取类的父类。 getInterfaces():获取类实现的所有接口。
-
Field类:表示类的成员变量。
主要方法: get(Object obj):获取指定对象的字段值。 set(Object obj, Object value):设置指定对象的字段值。 getType():获取字段的数据类型。 getModifiers():获取字段的修饰符(如 public、private)。
-
Method类:表示类的方法。
主要方法: invoke(Object obj, Object... args):调用指定对象的方法。 getReturnType():获取方法的返回类型。 getParameterTypes():获取方法的参数类型。 getModifiers():获取方法的修饰符(如 public、private)。
-
Constructor类:表示类的构造方法。
主要方法: newInstance(Object... initargs):创建一个新实例,使用指定的构造函数参数。 getParameterTypes():获取构造函数的参数类型。 getModifiers():获取构造函数的修饰符(如 public、private)。
二、使用反射的步骤
- 获取Class对象:
获取Class对象的方式有三种:- 通过类名:
Class<?> clazz = ClassName.class;
- 通过对象的getClass()方法:
Object obj = new ClassName(); Class<?> clazz = obj.getClass();
- 通过Class.forName()方法:
Class<?> clazz = Class.forName("com.example.ClassName");
- 通过类名:
- 获取构造方法、字段和方法:
使用Class对象可以获取类的构造方法、字段和方法。- 获取构造方法:
Constructor<?> constructor = clazz.getConstructor(parameterTypes);
- 获取字段:
Field field = clazz.getField("fieldName");
- 获取方法:
Method method = clazz.getMethod("methodName", parameterTypes);
- 获取构造方法:
- 创建实例:
使用构造方法创建类的实例:Object instance = constructor.newInstance(arguments);
- 访问字段:
可以读取或修改对象的字段值:// 读取字段值 Object value = field.get(instance);// 修改字段值 field.set(instance, newValue);
- 调用方法:
可以调用对象的方法:Object returnValue = method.invoke(instance, arguments);
- 处理访问权限:
如果需要访问私有字段或方法,可以使用setAccessible(true)来绕过Java的访问控制检查:field.setAccessible(true); method.setAccessible(true);
示例代码
以下是一个简单的示例,展示如何使用反射来调用一个类的方法:
import java.lang.reflect.Method;public class ReflectionExample {public static void main(String[] args) {try {// 获取Class对象Class<?> clazz = Class.forName("com.example.MyClass");// 创建类的实例Object instance = clazz.getDeclaredConstructor().newInstance();// 获取方法Method method = clazz.getDeclaredMethod("myMethod", String.class);// 调用方法method.invoke(instance, "Hello, Reflection!");} catch (Exception e) {e.printStackTrace();}}
}
三、反射的常用操作
3.1 获取类的信息
1. 获取类名:
String className = clazz.getName();2. 获取包名:
Package packageName = clazz.getPackage();3. 获取父类:
Class<?> superClass = clazz.getSuperclass();4. 获取实现的接口:
Class<?>[] interfaces = clazz.getInterfaces();
3.2 操作类的构造方法
1. 获取构造方法:
Constructor<?>[] constructors = clazz.getConstructors();2. 调用构造方法创建对象:
Constructor<?> constructor = clazz.getConstructor(parameterTypes);
Object instance = constructor.newInstance(arguments);
3.3 操作类的字段
1. 获取字段:
Field[] fields = clazz.getFields(); // 获取所有公共字段
Field field = clazz.getDeclaredField("fieldName"); // 获取指定字段2. 访问和修改字段:
field.setAccessible(true); // 如果是私有字段,需要设置可访问
Object value = field.get(instance); // 获取字段值
field.set(instance, newValue); // 设置字段值
3.4 操作类的方法
1. 获取方法:
Method[] methods = clazz.getMethods(); // 获取所有公共方法
Method method = clazz.getDeclaredMethod("methodName", parameterTypes); // 获取指定方法2. 调用方法:
method.setAccessible(true); // 如果是私有方法,需要设置可访问
Object result = method.invoke(instance, arguments); // 调用方法
四、反射的优缺点
优点:
- 动态性:可以在运行时动态加载类、调用方法、访问字段。
- 灵活性:可以用于开发通用框架和库,如依赖注入框架、测试框架等。
缺点:
- 性能开销:反射操作通常比直接调用慢,因为它涉及动态类型检查。
- 安全性:反射可以绕过访问修饰符,可能导致安全问题。
- 复杂性:代码可读性和可维护性较差。
相关文章:
Java 反射
一、基本概念 Java反射机制是Java语言的一种动态特性,允许程序在运行时检查和操作类、接口、字段和方法。反射机制使得Java程序可以在运行时获取关于类的详细信息,并且可以动态地调用类的方法、访问类的字段等。反射机制主要涉及以下几个核心类和接口&a…...

【目标检测01】真实框、预测框、锚框和交并比IoU
文章目录 1. 任务定义2. 基本概念2.1 边界框(bounding box)2.2 真实框、预测框和锚框2.3 交并比 (IoU)2.4 代码实现 1. 任务定义 目标检测的主要目的是让计算机可以自动识别图片或者视频帧中所有目标的类别,并在该目标周围绘制边界框&#x…...
青少年编程能力等级测评CPA C++五级试卷(2)
青少年编程能力等级测评CPA C++五级试卷(2) 一、单项选择题(共15题,每题3分,共45分) CP5_2_1.下列有关类的重用方法的叙述中,不正确的是( )。 A.类的继承可以实现类的重用 B.类的组合可以实现类的重用 C.类的封装可以实现类的重用 D.类的继承和类的组合都可…...
SATA数据线
SATA 数据线(Serial ATA 数据线)是一种用于连接计算机主板与存储设备(如硬盘、固态硬盘和光驱)的线缆。它的主要作用是传输数据,允许计算机与这些设备之间进行高效的数据交换。 主要作用 数据传输:SATA 数…...

《云原生安全攻防》-- K8s攻击案例:权限维持的攻击手法
在本节课程中,我们将一起深入了解K8s权限维持的攻击手法,通过研究这些攻击手法的技术细节,来更好地认识K8s权限维持所带来的安全风险。 在这个课程中,我们将学习以下内容: K8s权限维持:简单介绍K8s权限维持…...

回溯算法-Java【力扣】【算法学习day.14】
前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴&am…...
从本地到云端:跨用户请求问题的完美解决方案
对于某些单个请求或响应中含有多个用户信息的服务,SDK提供了一套基于统一的UCS拆分和聚合的解决方案供开发者使用。 请求拆分 对于跨用户服务的请求,我们提供了两个处理方案: 【1】根据用户信息拆分请求: 场景:请求内…...
leetcode day4 409+5
409 最长回文串 给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的 回文串 的长度。 在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。 示例 1: 输入:s "abccccdd" 输出:7 解…...

英语语法学习框架(考研)
一、简单句 英语都是由简单句构成,简单句共有五种基本句型:①主谓;②主谓宾;③主谓宾宾补;④主谓宾间宾(间接宾语);⑤主系表; 其中谓语是句子最重要的部分,谓…...

基于neo4j的学术论文关系管理系统
正在为毕业设计头疼?又或者在学术研究中总是找不到像样的工具来管理浩瀚的文献资料?今天给大家介绍一款超实用的工具——基于Neo4j的学术论文关系管理系统,让你轻松搞定学术文献的管理与展示!🎉 系统的核心是什么呢&a…...

C#中的委托、匿名方法、Lambda、Action和Func
委托 委托概述 委托是存有对某个方法的引用的一种引用类型变量。定义方法的类型,可以把一个方法当作另一方法的参数。所有的委托(Delegate)都派生自 System.Delegate 类。委托声明决定了可由该委托引用的方法。 # 声明委托类型 委托类型声…...

IDEA关联Tomcat——最新版本IDEA 2024
1.链接Tomcat到IDEA上 添加Tomcat到IDEA上有两种方式: 第一种: (1)首先,来到欢迎界面,找到左侧的Customize选项 (2)然后找到Build、Execution、Deployment选项 (3&am…...
【如何获取股票数据18】Python、Java等多种主流语言实例演示获取股票行情api接口之沪深A股解禁限售数据获取实例演示及接口API说明文档
最近一两年内,股票量化分析逐渐成为热门话题。而从事这一领域工作的第一步,就是获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的主要任…...

NVR小程序接入平台/设备EasyNVR多品牌NVR管理工具/设备的多维拓展与灵活应用
在数字化安防时代,NVR批量管理软件/平台EasyNVR作为一种先进的视频监控系统设备,正逐步成为各个领域监控解决方案的首选。NVR批量管理软件/平台EasyNVR作为一款基于端-边-云一体化架构的国标视频融合云平台,凭借其部署简单轻量、功能多样、兼…...

GPT-4o 和 GPT-4 Turbo 模型之间的对比
GPT-4o 和 GPT-4 Turbo 之间的对比 备注 要弄 AI ,不同模型之间的对比就比较重要。 GPT-4o 是 GPT-4 Turbo 的升级版本,能够提供比 GPT-4 Turbo 更多的内容和信息,但成功相对来说更高一些。 第三方引用 在 2024 年 5 月 13 日࿰…...

gin入门教程(10):实现jwt认证
使用 github.com/golang-jwt/jwt 实现 JWT(JSON Web Token)可以有效地进行用户身份验证,这个功能往往在接口前后端分离的应用中经常用到。以下是一个基本的示例,演示如何在 Gin 框架中实现 JWT 认证。 目录结构 /hello-gin │ ├── cmd/ …...
Python 基础语法 - 数据类型
顾名思义,计算机就是用来做数学计算的机器,因此,计算机程序理所当然的可以处理各种数值。但是,计算机能处理的远远不止数值,还可以处理文本,图形,音频,视频,网页等各种各…...

自托管无代码数据库Undb
什么是 Undb ? Undb 是一个无代码平台,也可以作为后端即服务 (BaaS)。它基于 SQLite,可以使用 Bun 打包成二进制文件用于后端服务。此外,它可以通过 Docker 部署为服务,提供表管理的 UI。 软件特点: ⚡ 无…...

正则的正向前瞻断言和负向前瞻断言
正则的正向前瞻断言和负向前瞻断言 一. 正向前瞻断言二. 负向前瞻断言三. 总结 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 正向前瞻断言和负向前瞻断言是正则表达式中用于检查后续字…...
大厂物联网(IoT)高频面试题及参考答案
目录 解释物联网 (IoT) 的基本概念 物联网的主要组成部分有哪些? 描述物联网的基本架构。 IoT 与传统网络有什么区别? 物联网中常用的传感器类型有哪些? 描述物联网的三个主要层次。 简述物联网中数据安全的重要性 描述物联网安全的主要威胁 解释端到端加密在 IoT 中…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...