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

Java的反射原理

反射允许程序在运行时检查或修改其类、接口、字段和方法的行为。反射主要通过java.lang.reflect包中的类和接口实现,它主要用于以下目的:

  1. 在运行时分析类的能力:通过反射,可以在运行时检查类的结构,比如它的方法、构造函数、字段等。
  2. 在运行时查看对象:可以调用对象的私有方法和访问私有字段(尽管这通常不推荐,因为它破坏了封装性)。
  3. 实现通用的数组操作代码:通过反射,可以编写能够操作任何类型数组的代码。
  4. 利用动态代理:反射经常与动态代理一起使用,以在运行时创建接口的代理实现。

反射的基本用法

反射主要通过以下几个类来实现:

  • Class:代表正在运行的Java应用程序中的类和接口。
  • Field:提供有关类或接口的字段的信息,以及对它的动态访问权限。
  • Method:提供关于类或接口的方法的信息,以及对它的动态访问权限。
  • Constructor:提供关于类的构造方法的信息,以及对它的动态访问权限。
获取Class对象

获取Class对象有三种常见方式:

  1. 使用Class.forName("完全限定名")静态方法(可能抛出ClassNotFoundException)。
  2. 使用类名.class语法。
  3. 使用对象的getClass()方法。

通过class对象获取对象的属性

获取指定属性名的public属性——getField(属性名)

获取全部public属性——getFields()

获取已声明的指定属性名的属性——getDeclaredField(属性名)

获取已声明的所有属性——getDeclaredFields() 

获取属性的类型、名字、修饰符
获取属性值——get(对象名)

对于public和protected属性,可以直接get和set

 对于private属性,必须要设置可访问,才可get和set

修改属性值——set(对象名,属性值)

 记得private属性必须要setAccessible(true)

通过class对象获取对象的构造器
 

上图只有2个构造方法,一个是有一个参数的,一个是有2个参数的

获取特定参数类型、个数的构造器——getConstructor(参数类型的class对象)
获取所有构造器——getConstructors()

获取构造器的参数——getParameters()
 通过class对象获取对象的方法
根据方法名获取已声明的方法——getDeclaredMethod(方法名,参数类型的class对象)

根据方法名获取public方法——getMethod(方法名,参数类型的class对象) 

获取所有public方法——getMethods() 

这里不仅包括对象(aClass)的所有public方法,还包括该对象隐式继承的object类中的public方法

 获取所有已声明方法——getDeclaredMethods() 

 获取方法返回类型——getReturnType()

获取方法上注解为@xxx的方法——getAnnotation(注解的class对象)
获取方法的名字——getName()
 修改方法中的参数并重新执行——invoke(对象,修改后的参数)

原来给output方法传的参数是“”,通过invoke函数修改参数并重新执行该对象的output函数后,参数改变了。

执行对象中的private方法——invoke(对象)

给类添加一个private方法 

通过反射执行

小结——对于对象
  •  只想获取public属性就使用getField(属性名)或getFields()
  • 想获取任意属性(不局限于public、protected、private)就使用getDeclaredField(属性名)或getDeclaredFields()
  • 想获取属性的类型用getType(),想获取属性的名字用getName(),想获取属性的修饰符用getModifiers()
  • 想获取属性的值用get(对象),想设置属性的值用set(对象,值),private属性得先将属性设置为可达setAccessible(),才能get()和set()
  • 想获取指定参数个数类型的构造器就使用getConstructor()
  • 想获取所有构造器就使用getConstructors()
  • 获取构造器的参数就使用getParameters()
  • 只想获取public方法就使用getMethod(方法名)或getMethods()(后者会获取到继承类上的public方法)
  • 想获取任意方法(不局限于public、protected、private)就使用getDeclaredMethod(方法名)或getDeclaredMethods()
  • 想获取方法上的注解就使用getAnnotation(注解的class类)
  • 想获取方法的返回值就使用getReturnType()
  • 想获取方法名就使用getName()
  • 想执行方法就用invoke(对象)
  • 想修改方法所传参数的值并重新执行该方法就使用invoke(对象,修改后的值)

相关文章:

Java的反射原理

反射允许程序在运行时检查或修改其类、接口、字段和方法的行为。反射主要通过java.lang.reflect包中的类和接口实现,它主要用于以下目的: 在运行时分析类的能力:通过反射,可以在运行时检查类的结构,比如它的方法、构造…...

vue.config.js 配置

vue.config.js 文件是 Vue CLI 项目中的全局配置文件,它允许你以 JavaScript 的形式来配置构建选项,而不是通过命令行参数或者 .vue-clirc 的 JSON 格式。 官方文档: https://cli.vuejs.org/zh/config/#全局-cli-配置 基础配置 publicPath 设置构建好的…...

C ++ 也可以搭建Web?高性能的 C++ Web 开发框架 CPPCMS + MySQL 实现快速入门案例

什么是CPPCMS? CppCMS 是一个高性能的 C Web 开发框架,专为构建快速、动态的网页应用而设计,特别适合高并发和低延迟的场景。其设计理念类似于 Python 的 Django 或 Ruby on Rails,但针对 C 提供了更细粒度的控制和更高效的性能。…...

Taos 常用命令工作笔记(二)

最近测试创建一个涛思的数据库和一堆表进行测试,通过json配置文件配置字段的类型、名称等,程序通过解析json文件的配置,动态创建数据库的表。 其中表字段为驼峰结构的规则命名,创建表也是成功的,插入的测试数据也是成功…...

idea安装二进制文本阅读插件

引言 在软件开发过程中,有时需要查看二进制文件的内容以调试或分析问题。虽然有许多专用工具可以处理这类任务,但直接在 IDE 内集成这些功能无疑更加方便高效。本文将介绍如何在 IntelliJ IDEA 2023中安装和配置一个名为 BinEd的插件,以及如…...

MySQL 常用 SQL 语句大全

1. 基本查询 查询所有记录和字段 SELECT * FROM table_name; 查询特定字段 SELECT column1, column2 FROM table_name; 查询并限制结果 SELECT column1, column2 FROM table_name LIMIT 10; 条件查询 SELECT column1, column2 FROM table_name WHERE condition; 模糊匹…...

[Spring] Spring事务与事务的传播

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...

Java 网络编程练习

InternetExercise1 package InternetExercise20240815;public class InternetExercise1 {public static void main(String[] args) {// 网络编程// 在网络通信协议下,不同计算机上面运行的程序,可以实现不同计算机上的数据传输// 网络编程三要素// 1.IP…...

中国科技统计年鉴,数据覆盖1991-2022年多年份

基本信息. 数据名称: 中国科技统计年鉴 数据格式: excel 数据时间: 1991-2022年 数据几何类型: xlsx 数据坐标系: WGS84 数据来源:国家统计局 数据预览: 数据可视化....

大模型的训练过程

大模型的训练是一个复杂的过程,涉及多个步骤和技术。下面我将概述大模型训练的主要流程,包括预训练、微调等关键阶段,并解释一些常见的技术和策略。 1. 数据准备 数据收集:收集大量多样化的数据,包括文本、图像、音频…...

4款ai在线改写工具,帮你轻松一键智能改写文章

在当今数字化内容创作的浪潮中,ai技术的应用为我们带来了极大的便利,尤其是在文章改写方面。以下将为大家详细分享四款出色的ai在线改写工具,从而帮助大家提升创作效率和质量。 ai在线改写工具一:智媒ai伪原创工具 它是一款备受好…...

Maven Mirror - 仓库镜像的介绍和配置

Maven Mirror(Maven镜像)是Maven构建工具中用于优化依赖下载速度和提高构建效率的一种机制。 在使用 Maven 构建应用程序时,Maven 默认会从 Maven 官方的中央仓库中下载依赖包。但是,在该仓库受到网络限制或访问速度过慢等问题时&…...

DevEcoStudio对Gitee进行变基与合并

当尝试将本地分支的更改推送到远程仓库,但是远程仓库中的该分支已经有了您本地分支中没有的提交时,会出现这个提示。 具体来说,这个提示意味着: 推送被拒绝:不能直接将更改推送到远程仓库,因为远程仓库中…...

2024 NVIDIA Summer Camp Day1:构建RAG多模态AI Agent

下载材料和课件等 课程相关资料下载链接: https://pan.baidu.com/s/15Y-gmsfeYCgKF-M3TJZVgg?pwdfafe 提取码: fafe 1.课件 链接:https://pan.baidu.com/s/15JTy9CqnesXSlPiwwrUmjA?pwd1111 提取码:1111 2.phi3量化大模型 链接:http…...

微服务之间的通信?

微服务之间的通信是微服务架构中的关键部分,它决定了服务之间如何进行数据交换和协同工作。微服务架构通过将大型应用拆分成多个小型、独立的服务,每个服务专注于完成特定的业务功能,从而提高了系统的可伸缩性、可维护性和可靠性。以下是微服…...

Elasticsearch 聚合概览及示例

Elasticsearch 是一个强大的搜索引擎,除了提供搜索功能外,它还内置了丰富的聚合功能,允许用户对数据进行统计、分析和运算。聚合可以帮助我们理解数据的分布和统计特性,是数据探索和报告的重要工具。本文将介绍 Elasticsearch 中的…...

【抓包】- Fiddler抓包教程,使用Fiddle抓取B站视频;ffmpeg的使用方法

一、预准备:过滤器设置 打开fiddler后,清空内容,然后播放视频。 找到与B站视频资源相关的回应,而后在“原始(raw)”标签中查看它的host信息。 发现B站视频资源的服务器DNS地址为【*bilivideo.cn】、【*bi…...

Linux网络配置和维护命令(三)

文章目录 网络接口配置-network-scripts文件远程复制文件-scp定义主机名与IP地址的关系-hosts文件登录远程主机-sshIP/主机名配置DNS域名解析服务器-resolv.conf文件 本篇讲解:网络接口配置-network-scripts文件、远程复制文件-scp、定义主机、名与IP地址的关系-hos…...

代码随想录算法训练营第二天 |209.长度最小子数组; 59.螺旋矩阵|| ; 前缀和

今日任务 209.长度最小子数组; 59.螺旋矩阵|| 58.区间和 44.开发商购买土地 209.长度最小的子数组 题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。 拓展题目可以先不做。 题目链接&#xf…...

Go语言基础--数据类型(整型、字符型)

转义字符 常用的转义字符有如下: 1)\t : 表示一个制表符,通常使用它可以排版。 2)\n:换行符 3)\\:一个\ 4) \":一个" 5)\r:一个回车 数据类型概述 在 Go 编程语言中,数据类型用于声明函数和变量…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

EtherNet/IP转DeviceNet协议网关详解

一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...

区块链技术概述

区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...

若依登录用户名和密码加密

/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...