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

Java 反射机制

Java 反射(Reflection)是 Java 语言提供的一种在运行时动态获取类信息、创建对象、调用方法、访问属性等功能的机制。它允许程序在运行时对类进行检查、修改和调用,而不需要在编译时就知道类的具体信息。

一、反射的主要类和方法

  1. Class类:

    • Class类是反射的核心,它代表一个类的类型信息。可以通过以下方式获取Class对象:
      • Object.getClass():对于一个已经存在的对象,可以通过调用getClass()方法获取其对应的Class对象。
      • .class语法:对于已知的类名,可以直接使用.class语法获取Class对象,例如String.class
      • Class.forName(String className):通过类的全限定名动态加载类并获取其Class对象。
    • Class类的主要方法:
      • getConstructor(Class<?>... parameterTypes):获取指定参数类型的构造方法。
      • getDeclaredConstructor(Class<?>... parameterTypes):获取当前类声明的指定参数类型的构造方法,包括私有构造方法。
      • getMethod(String name, Class<?>... parameterTypes):获取指定名称和参数类型的公共方法。
      • getDeclaredMethod(String name, Class<?>... parameterTypes):获取当前类声明的指定名称和参数类型的方法,包括私有方法。
      • getField(String name):获取指定名称的公共字段。
      • getDeclaredField(String name):获取当前类声明的指定名称的字段,包括私有字段。
      • newInstance():创建该类的一个新实例,调用无参构造方法。
  2. Constructor类:

    • 代表类的构造方法。可以通过Class类的getConstructor()getDeclaredConstructor()方法获取Constructor对象。
    • 主要方法:
      • newInstance(Object... initargs):使用指定的参数创建该构造方法对应的类的实例。
  3. Method类:

    • 代表类的方法。可以通过Class类的getMethod()getDeclaredMethod()方法获取Method对象。
    • 主要方法:
      • invoke(Object obj, Object... args):在指定的对象上调用该方法,并传入参数。
  4. Field类:

    • 代表类的字段。可以通过Class类的getField()getDeclaredField()方法获取Field对象。
    • 主要方法:
      • get(Object obj):获取指定对象上该字段的值。
      • set(Object obj, Object value):设置指定对象上该字段的值。

二、反射的主要用途

动态创建对象:

       可以在运行时根据类名创建对象,而不需要在编译时就知道具体的类。

 例如:

     try {Class<?> clazz = Class.forName("com.example.SomeClass");Object obj = clazz.newInstance();} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {e.printStackTrace();}

访问和修改私有成员:

       反射可以突破访问限制,访问和修改类的私有构造方法、私有方法和私有字段。

 例如:

     try {Class<?> clazz = SomeClass.class;Constructor<?> constructor = clazz.getDeclaredConstructor();constructor.setAccessible(true);Object obj = constructor.newInstance();Field field = clazz.getDeclaredField("privateField");field.setAccessible(true);field.set(obj, newValue);Method method = clazz.getDeclaredMethod("privateMethod");method.setAccessible(true);method.invoke(obj);} catch (Exception e) {e.printStackTrace();}
  1. 实现依赖注入:

    • 在一些框架中,反射被用于实现依赖注入。通过配置文件或注解,框架可以在运行时自动创建对象并设置其依赖关系。
    • 例如,在 Spring 框架中,通过反射机制可以将一个对象的依赖自动注入到该对象中,而不需要在代码中显式地创建和设置依赖。
  2. 实现插件系统:

    • 反射可以用于实现插件系统,允许在程序运行时动态地加载和使用插件。插件可以是独立的 JAR 文件,通过配置文件指定要加载的插件类,程序可以在运行时使用反射机制加载这些插件并调用其方法。
    • 例如,一个图像编辑软件可以使用插件系统来支持不同的图像格式,用户可以在运行时安装新的插件来处理新的图像格式。

三、反射的优缺点

  1. 优点:

    • 灵活性:反射机制使得程序可以在运行时动态地获取类信息、创建对象、调用方法、访问属性等,极大地提高了程序的灵活性。
    • 可扩展性:反射机制使得程序可以在不修改源代码的情况下,通过配置文件或用户输入来扩展程序的功能。
    • 通用性:反射机制可以用于任何 Java 类,无论这些类是在编译时已知还是在运行时动态加载的。
  2. 缺点:

    • 性能开销:反射机制的使用会带来一定的性能开销。由于反射需要在运行时解析类信息、查找方法和字段等,这比直接调用方法或访问属性要慢得多。
    • 安全风险:反射机制可以突破访问限制,访问和修改私有成员变量和方法。这可能会导致安全风险,特别是在不可信的环境中。
    • 代码复杂性:反射机制的使用会增加代码的复杂性。由于反射需要处理各种异常和类型转换,代码可能会变得更加难以理解和维护。

总之,Java 反射是一种强大的机制,它提供了在运行时动态操作类的能力。但是,在使用反射时需要注意性能开销和安全风险,并谨慎处理异常和类型转换,以确保程序的正确性和稳定性。

相关文章:

Java 反射机制

Java 反射&#xff08;Reflection&#xff09;是 Java 语言提供的一种在运行时动态获取类信息、创建对象、调用方法、访问属性等功能的机制。它允许程序在运行时对类进行检查、修改和调用&#xff0c;而不需要在编译时就知道类的具体信息。 一、反射的主要类和方法 Class类&…...

详解MBR分区结构以及GPT分区结构

学习笔记: GUID&#xff08;GPT&#xff09;分区表详解_gpt分区表-CSDN博客 详解MBR分区结构以及GPT分区结构-CSDN博客 其中U盘作为移动存储设备&#xff0c;可不具备上述分区&#xff0c;也可识别...

jvm 调优篇

一 jvm调优篇 1.1 查看新生代和老年代的比例 输入命令&#xff1a; jinfo -flag NewRatio 17480 1.2 查看新生代&#xff0c;survivor和Eden区比例 1.3 查看jvm调优参数 二 调优参数 2.1 oom异常 通过visual vm查看 2.java dump 大对象 2.2 mat工具进行分析 栈的信息...

Spring AOP应用指南:概念、通知与表达式分析

目录 一.AOP的基础概念 二.Spring AOP的应用场景 三.Spring AOP的核心概念 ▐ 切点(Pointcut) ▐ 连接点(Join Point) ▐ 通知(Advice) ▐ 切面(Aspect) 通知类型 四.PointCut与Order 切面优先级 五.切点表达式 execution(...)表达式 annotation表达式 一.AOP的基…...

汽车的UDS诊断01

UDS(Unified Diagnostic Services):ISO14229中定义了汽车通用诊断协议;ISO15765规定了帧的格式; 1)UDS中的四种帧 UDS中的四种帧:单帧、首帧、流空帧、连续帧 图1 …...

MySQL——单表查询(二)按条件查询(6)DISTINCT 关键字作用于多个字段

DISTINCT 关键字可以作用于多个字段&#xff0c;其语法格式如下所示&#xff1a; SELECT DISTINCT 字段名 1,字段名 2,… FROM 表名; 在上面的语法格式中&#xff0c;只有 DISTINCT 关键字后指定的多个字段值都相同&#xff0c;才会裱认作是重复记录。 例如&#xff0…...

python从入门到精通:数据容器

数据容器介绍 一种可以容纳多份数据的数据类型&#xff0c;容纳的每一份数据称之为一个元素&#xff0c;可以是任意类型的数据&#xff0c;如字符串、数字、布尔等。 数据容器根据特点的不同&#xff0c;如&#xff1a; 是否支持重复元素 是否可以修改 是否有序&#xff0…...

Java 中都有哪些引用类型?

Java 中都有哪些引用类型&#xff1f; 强引用 在 Java 中最常见的就是强引用&#xff0c;把一个对象赋给一个引用变量&#xff0c;这个引用变量就是一个强引用。当一个对象被强引用变量引用时&#xff0c;它处于可达状态&#xff0c;它是不可能被垃圾回收机制回收的。因此强引…...

使用 Dify 和 AI 大模型理解视频内容:Qwen 2 VL 72B

接下来的几篇相关的文章&#xff0c;聊聊使用 Dify 和 AI 大模型理解视频内容。 本篇作为第一篇内容&#xff0c;以昨天出圈的“黑神话悟空制作人采访视频”为例&#xff0c;先来聊聊经常被国外厂商拿来对比的国产模型&#xff1a;千问系列&#xff0c;以及它的内测版。 写在…...

mybatisplus 通过xml 定义接口

在 MyBatis-Plus 中&#xff0c;虽然它极大地简化了 CRUD 操作&#xff0c;提供了许多注解方式&#xff08;如 Select、Insert、Update、Delete&#xff09;来直接在 Mapper 接口上定义 SQL 语句&#xff0c;但 MyBatis-Plus 仍然支持传统的 MyBatis 风格的 XML 配置方式来定义…...

上周稼先社区的活动

参天是什么&#xff1f; 最近”参天”很火&#xff0c;不仅MySQL社区&#xff0c;听说Monty最近也跟他们搞了很多活动。其实说起华为的数据库&#xff0c;只有从事数据库行业的人才知道高斯&#xff0c;其他很多人不知道。但是即使从事数据库相关的人&#xff0c;对另外一个产…...

day_45

115. 不同的子序列 class Solution:def numDistinct(self, s: str, t: str) -> int:dp [[0] * (len(t) 1) for _ in range(len(s) 1)]for i in range(len(s)):dp[i][0] 1for j in range(1, len(t)):dp[0][j] 0for i in range(1, len(s) 1):for j in range(1, len(t) …...

SQL 时间盲注 (injection 第十六关)

简介 SQL注入&#xff08;SQL Injection&#xff09;是一种常见的网络攻击方式&#xff0c;通过向SQL查询中插入恶意的SQL代码&#xff0c;攻击者可以操控数据库&#xff0c;SQL注入是一种代码注入攻击&#xff0c;其中攻击者将恶意的SQL代码插入到应用程序的输入字段中&#x…...

nginx核心配置示例

1.核心配置示例 基于不同的IP、不同的端口以及不用得域名实现不同的虚拟主机&#xff0c;依赖于核心模块 ngx_http_core_module实现。 1.新建一个 PC web 站点 # 访问测试 [rootnode100 ~]# curl www.root.org # 注意在访问主机中设解析 2.root 与 alias root &#xff1a;指…...

【面向对象】04面向对象三大特征之——继承

文章目录 一、super1.构造方法2.属性3.方法 二、规则三、继承权限 继承 继承是Java中实现代码重用的重要手段之一。使用继承&#xff0c;可以减少代码量&#xff0c;方便修改代码。Java中只支持单根继承&#xff0c;即一个类只能有一个直接父类。 继承使用关键字extends&#…...

计算机毕业设计Python+Flask弹幕情感分析 B站视频数据可视化 B站爬虫 机器学习 深度学习 人工智能 NLP文本分类 数据可视化 大数据毕业设计

### 开题报告&#xff1a;基于Python和Flask的弹幕情感分析系统 #### 一、研究背景 弹幕&#xff08;Danmaku&#xff09;是一种实时在视频播放过程中显示的评论或弹幕&#xff0c;起初源于日本&#xff0c;但在中国的二次元文化和直播平台中得到了广泛应用。弹幕作为一种独特…...

用基础项目来理解spring的作用

简介 spring官方的解释过于专业化&#xff0c;初学者可能比较难懂&#xff0c;接下来我将通过一个最基础的Java项目来尽可能的展示spring中的作用及spring的底层是如何来实现的。 项目结构 该项目是一个简单的JavaSE项目&#xff0c;没有maven或者tomcat等其他。只在控制台进…...

Json-复杂泛型解析工具类

为了处理复杂的 JSON 泛型解析任务,你可以创建一个通用的工具类来封装这些操作。这里分别 针对 Jackson 和 Fastjson 提供两个工具类的例子。 1. Jackson 的 JSON 泛型解析工具类 import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackso…...

CLIP-VIT-L + Qwen 多模态学习笔记 -3

多模态学习笔记 - 3 参考repo:WatchTower-Liu/VLM-learning; url: VLLM-BASE 吐槽 今天接着昨天的源码继续看&#xff0c;黑神话&#xff1a;悟空正好今天发售&#xff0c;希望广大coder能玩的开心~ 学习心得 前情提要 详情请看多模态学习笔记 - 2 上次我们讲到利用view(…...

如何将网站地图Sitemap提交至百度、谷歌及Bing搜索引擎

原文&#xff1a;如何将网站地图Sitemap提交至百度、谷歌及Bing搜索引擎 - 孔乙己大叔 (rebootvip.com) 在当今高度竞争的互联网环境中&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;对于网站的可见性和成功至关重要。网站地图&#xff08;Sitemap&#xff09;&#xff…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化

iOS 应用的发布流程一直是开发链路中最“苹果味”的环节&#xff1a;强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说&#xff0c;这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发&#xff08;例如 Flutter、React Na…...