Java的反射机制详解:动态操作类和对象

        Java反射是一种强大的机制,允许程序在运行时查询和操作类、方法、接口等。这种能力使得Java应用可以在运行时动态地创建对象、调用方法和访问属性,极大地提升了程序的灵活性和可扩展性。本文将深入探讨Java反射的原理、核心API和实际应用场景,以及如何正确和有效地使用反射。

#### 1. 反射机制基础

反射机制主要通过`java.lang.reflect`包中的类和接口提供支持,包括`Class`、`Method`、`Field`、`Constructor`等核心类。使用反射的第一步通常是获取`Class`对象的引用,它是反射操作的起点。

- **获取Class对象**:
  - 直接通过类的`.class`属性。
  - 通过实例对象调用`getClass()`方法。
  - 使用`Class.forName()`静态方法,这种方式常用于动态加载类。

```java
Class<String> stringClass = String.class;
Class<?> clazz = "Hello, World!".getClass();
Class<?> dynamicClass = Class.forName("java.lang.String");
```

#### 2. 查询类信息

反射可以用来查询类的构造函数、方法、字段和父类信息。这对于编写通用代码库和框架尤为重要,因为它们需要能处理未知的类。

- **查询方法**:
  - `getDeclaredMethods()`:返回类中声明的所有方法,包括公有、保护、默认(包)访问和私有方法,但不包括继承的方法。
  - `getMethods()`:返回类中所有公有的方法,包括从父类继承的公有方法。

- **查询字段**:
  - `getDeclaredFields()`:返回类中声明的所有字段。
  - `getFields()`:返回类中所有公有的字段,包括从父类继承的。

#### 3. 创建对象和访问属性

反射不仅可以用于查询,还可以用于创建对象和访问对象的属性和方法。

- **创建对象**:
  - 使用`Class.newInstance()`(已弃用)或者通过`Constructor`对象的`newInstance()`方法创建类的实例。
  
- **访问字段和方法**:
  - 通过`Field`对象的`get()`和`set()`方法读写对象的属性。
  - 通过`Method`对象的`invoke()`方法调用对象的方法。

```java
Constructor<String> constructor = String.class.getConstructor(String.class);
String strObj = constructor.newInstance("Hello");
Method method = clazz.getMethod("length");
int length = (Integer) method.invoke(strObj);
```

#### 4. 反射的应用场景

- **框架开发**:如Spring框架广泛使用反射来实现依赖注入和服务定位。
- **插件和扩展机制**:反射允许动态加载和扩展应用的功能。
- **代码分析工具**:反射用于开发各种代码分析和测试工具。

#### 5. 反射的注意事项

尽管反射非常强大,但它也有一些缺点,如性能开销较大和安全风险。因此,在考虑使用反射时,需要权衡其带来的便利和潜在的问题。

#### 6. 总结

Java反射提供了一种强大的工具来增加程序的灵活性和可扩展性。通过本文的介绍,希望您能够更好地理解反射的原理和应用,以及如何在您的Java应用中有效地利用这一机制。正确使用反射可以为开发高度可配置的应用和框架提供巨大的帮助

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/15576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter 中的 CupertinoSlidingSegmentedControl 小部件:全面指南

Flutter 中的 CupertinoSlidingSegmentedControl 小部件&#xff1a;全面指南 在Flutter框架中&#xff0c;CupertinoSlidingSegmentedControl是一个用于创建类似iOS风格的滑动分段控制器的小部件。这种控制器通常用于允许用户在不同的视图或设置之间切换。本文将为您提供一个…

轻量级 K8S 环境 安装minikube

文章目录 操作系统DockerDocker CE 镜像源站使用官方安装脚本自动安装 &#xff08;仅适用于公网环境&#xff09;安装校验Docker代理docker permission denied while trying to connect to the Docker daemon socket minikubekubectl工具minikube dashboard参考资料 操作系统 …

Docker进入容器查看内容并从容器里拷贝文件到宿主机

工作中需要从docker正在运行的镜像中复制文件到宿主机&#xff0c;于是便将这个过程记录了下来。 &#xff08;1&#xff09;查看正在运行的容器 通过以下命令&#xff0c;可以查看正在运行的容器&#xff1a; docker ps &#xff08;2&#xff09;进入某个容器执行脚本 我…

前端人员选择组件封装

功能&#xff1a; 人员选择&#xff0c;返回人员参数&#xff0c;以及人员参数id数组支持单选&#xff0c;多选人员支持重新选择回显上次选中人员 <!-- 弹窗 --><a-modal v-model"modalVisible" :footer"null" :bodyStyle"{ padding: 0 }&q…

react中子传父信息

思路是&#xff1a; 在父组件定义一个函数接受参数&#xff0c;接收的参数用于接收子组件的信息&#xff0c;把函数传给子组件&#xff0c;子组件调用父亲传来的函数并把要告诉父亲的话传到函数中&#xff0c;就实现了子传父消息 import { useState } from reactimport { use…

OpenWrt 安装Quagga 支持ospf Bgp等动态路由协议 软路由实测 系列四

1 Quagga 是一个路由软件套件, 提供 OSPFv2,OSPFv3,RIP v1 和 v2,RIPng 和 BGP-4 的实现. 2 web 登录安装 #或者ssh登录安装 opkg install quagga quagga-zebra quagga-bgpd quagga-watchquagga quagga-vtysh # reboot 3 ssh 登录 #重启服务 /etc/init.d/quagga restart #…

使用kubesphere部署微服务的时候,节点的镜像不是最新的导致部署到旧版本问题

我使用kubesphere部署微服务的时候&#xff0c;发现有很多次&#xff0c;我修改了配置文件&#xff0c;但是部署完才发现部署的是旧版本。 然后我查看了该微服务部署在哪个节点上&#xff1a; kubectl get pods --all-namespaces -o wide例如 gulimall-gateway 这个服务&…

韭菜的自我总结

韭菜的自我总结 股市技术面量价关系左侧右侧右侧技术左侧技术洗盘 韭菜的自我修养虚拟货币的启示韭菜的买入时机韭菜的心理压力成为优秀玩家的关键 股市技术面 技术面分析可以作为买卖时机判定的工具&#xff0c;但是投资还是需要基本面的分析作为支撑。也就是基本面选股&…

langchain进阶一:特殊的chain,轻松实现对话,与数据库操作,抽取数据,以及基于本地知识库的问答

特殊的chain langchain中的Chain有很多,能够轻松实现部分需求,极致简化代码,但是实现效果与模型智慧程度有关 会话链 效果与LLMChain大致相同 javascript 复制代码 from langchain.chains import ConversationChain from langchain_community.llms import OpenAI conversat…

Spring Boot中如何实现定时任务?

在项目开发中&#xff0c;经常需要编写定时任务来实现一些功能&#xff1a; 定时备份数据库、定时发送邮件、定时清理数据、定时提醒或通知、信用卡每月还款提醒 未支付的订单15分钟之后自动取消、未确认收货的订单7天之后自动确认收货 定时任务的实现&#xff1a; Spring T…

Redis 实战 - 缓存异常及解决方案

文章目录 概述一、缓存穿透1.1 缓存穿透是什么1.2 解决方案 二、缓存击穿2.1 缓存击穿是什么2.2 解决方案 三、缓存雪崩3.1 缓存雪崩是什么3.2 解决方案 四、拓展4.1 缓存预热4.2 缓存降级 五、结语 把今天最好的表现当作明天最新的起点……&#xff0e;&#xff5e; 概述 在实…

YoloV8改进策略:Neck层改进、注意力改进|HCANet全局与局部的注意力模块CAFM|二次创新|即插即用

yolov9-c summary: 620 layers, 52330674 parameters, 0 gradients, 245.5 GFLOPsClass Images Instances P R mAP50 mAP50-95: 100%|██████████| 15/15 00:06all 230 1412 0.917 0.985 0.99 0.735…

实现自动化巡检多台交换机并将输出信息保存到文本文件中

为了实现自动化巡检多台交换机并将输出信息保存到文本文件中,可以扩展之前的 SSHInspectionTool 类,使其能够处理多台交换机的连接和命令执行。我们可以使用多线程来并行处理多个 SSH 连接,以提高效率。 目录 一、导入依赖包 二、编写Java类 (1)SSH.java (2)SSHIns…

LeetCode 第131场双周赛个人题解

100309. 求出出现两次数字的 XOR 值 原题链接 求出出现两次数字的 XOR 值 - 力扣 (LeetCode) 竞赛 思路分析 签到题&#xff0c;一次遍历 AC代码 class Solution:def duplicateNumbersXOR(self, nums: List[int]) -> int:cnt Counter(nums)res 0st set(nums)for x …

Python基础学习笔记(七)——元组

目录 一、一维元组的介绍、创建与修改二、组合的基本操作1. 遍历2. 取长度3. 取最值4. 打包5. 批处理5.1 map()函数5.2 lambda 表达式5.3 lambda 表达式 map()函数 一、一维元组的介绍、创建与修改 元组&#xff08;tuple&#xff09;&#xff0c;一种不可变、有序、可重复的数…

SpringBoot如何开启注解的形式,使用Redis Cache

Spring Cache 是一个框架&#xff0c;实现了基于注解的缓存功能&#xff0c;只需要简单的添加注解&#xff0c;就能实现缓存功能。 Spring Cache 提供了一层抽象&#xff0c;底层可以切换不同的缓存实现&#xff0c;例如&#xff1a;Redis、EHCache、Caffeine等 步骤&#xf…

【大模型】Spring AI对接ChatGpt使用详解

目录 一、前言 二、spring ai介绍 2.1 什么是Spring AI 2.2 Spring AI 特点 2.3 Spring AI 为开发带来的便利 2.4 Spring AI应用领域 2.4.1 聊天模型 2.4.2 文本到图像模型 2.4.3 音频转文本 2.4.4 嵌入大模型使用 2.4.5 矢量数据库支持 2.4.6 用于数据工程ETL框架 …

2024-05-22 VS2022使用modules

点击 <C 语言编程核心突破> 快速C语言入门 VS2022使用modules 前言一、准备二、使用其一, 用VS installer 安装模块:第二个选项就是, 与你的代码一同编译std模块, 这个非常简单, 但是也有坑. 总结 前言 要解决问题: 使用VS2022开启modules. 想到的思路: 跟着官方文档整…

Java进阶学习笔记19——内部类

1、 内部类&#xff1a; 是类中五大成分之一&#xff08;成员变量、方法、构造函数、内部类、代码块&#xff09;&#xff0c;如果一个类定义在另一个 类的内部&#xff0c;这个类就是内部类。 场景&#xff1a;当一个类的内部&#xff0c;包含了一个完整的事物&#xff0c;且…

Android ART 虚拟机简析

源码基于&#xff1a;Android U 1. prop 名称选项名称heap 变量名称功能 dalvik.vm.heapstartsize MemoryInitialSize initial_heap_size_ 虚拟机在启动时&#xff0c;向系统申请的起始内存 dalvik.vm.heapgrowthlimit HeapGrowthLimit growth_limit_ 应用可使用的 max…