java-反射 1

## Java 中的反射机制详解

### 1. 引言

Java 反射机制(Reflection)是一种非常强大的特性,它允许程序在运行时检查和操作对象的内部结构,包括类、方法、字段和构造函数等。反射机制提供了一种动态操作对象的方法,使得 Java 程序具有更高的灵活性和扩展性。本文将详细介绍 Java 反射的基本概念、实现方法、常用操作及其在实际应用中的案例。

### 2. 反射的基本概念

#### 2.1 反射的定义

反射是指程序在运行时能够检查和操作自身结构的一种能力。在 Java 中,反射主要用于动态地获取类的结构信息(如类名、方法、字段等),并对其进行操作。通过反射,程序可以在运行时创建对象、调用方法、访问字段等。

#### 2.2 反射的优缺点

**优点:**

- **动态性**:反射允许程序在运行时动态地操作对象,增加了程序的灵活性和扩展性。
- **框架支持**:许多 Java 框架(如 Spring、Hibernate)广泛使用反射机制来实现依赖注入、对象持久化等功能。
- **通用性**:反射可以实现通用的代码逻辑,减少重复代码。

**缺点:**

- **性能开销**:反射操作需要进行大量的类型检查和安全检查,性能比直接调用低。
- **安全性风险**:反射可以绕过访问控制,可能导致安全漏洞。
- **代码复杂性**:反射代码通常较复杂,可读性和可维护性较差。

### 3. 反射的实现方法

#### 3.1 获取 Class 对象

在 Java 中,所有的类都由 `Class` 类的对象表示。获取 `Class` 对象的方法有三种:

1. **通过类名获取**:

```java
Class<?> clazz = Class.forName("com.example.MyClass");
```

2. **通过对象获取**:

```java
MyClass myObject = new MyClass();
Class<?> clazz = myObject.getClass();
```

3. **通过类字面量获取**:

```java
Class<?> clazz = MyClass.class;
```

#### 3.2 创建对象

通过反射创建对象可以使用 `Class` 类的 `newInstance` 方法或构造函数对象的 `newInstance` 方法。

1. **使用 `newInstance` 方法**:

```java
Class<?> clazz = MyClass.class;
MyClass myObject = (MyClass) clazz.newInstance();
```

2. **使用构造函数对象**:

```java
Class<?> clazz = MyClass.class;
Constructor<?> constructor = clazz.getConstructor(String.class); // 例如带一个 String 参数的构造函数
MyClass myObject = (MyClass) constructor.newInstance("example");
```

#### 3.3 访问字段

通过反射可以访问类的字段(包括私有字段)。可以使用 `getField` 和 `getDeclaredField` 方法获取字段对象,然后通过 `get` 和 `set` 方法进行操作。

```java
Class<?> clazz = MyClass.class;
Field field = clazz.getDeclaredField("fieldName");
field.setAccessible(true); // 访问私有字段时需要调用
Object value = field.get(myObject);
field.set(myObject, newValue);
```

#### 3.4 调用方法

通过反射可以调用类的方法。可以使用 `getMethod` 和 `getDeclaredMethod` 方法获取方法对象,然后通过 `invoke` 方法进行调用。

```java
Class<?> clazz = MyClass.class;
Method method = clazz.getDeclaredMethod("methodName", String.class); // 例如带一个 String 参数的方法
method.setAccessible(true); // 访问私有方法时需要调用
Object result = method.invoke(myObject, "example");
```

### 4. 反射的常用操作

#### 4.1 获取类信息

通过 `Class` 对象可以获取类的基本信息,如类名、修饰符、父类、实现的接口等。

```java
Class<?> clazz = MyClass.class;
String className = clazz.getName();
int modifiers = clazz.getModifiers();
Class<?> superClass = clazz.getSuperclass();
Class<?>[] interfaces = clazz.getInterfaces();
```

#### 4.2 获取构造函数

通过 `Class` 对象可以获取类的构造函数对象。

```java
Class<?> clazz = MyClass.class;
Constructor<?>[] constructors = clazz.getConstructors(); // 获取所有公共构造函数
Constructor<?> constructor = clazz.getConstructor(String.class); // 获取带一个 String 参数的公共构造函数
```

#### 4.3 获取字段

通过 `Class` 对象可以获取类的字段对象。

```java
Class<?> clazz = MyClass.class;
Field[] fields = clazz.getFields(); // 获取所有公共字段
Field field = clazz.getField("fieldName"); // 获取指定名称的公共字段
```

#### 4.4 获取方法

通过 `Class` 对象可以获取类的方法对象。

```java
Class<?> clazz = MyClass.class;
Method[] methods = clazz.getMethods(); // 获取所有公共方法(包括继承的方法)
Method method = clazz.getMethod("methodName", String.class); // 获取指定名称和参数类型的公共方法
```

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

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

相关文章

编写一个定时任务脚本,每两个小时杀死某进程,并重新启动带有指定参数的命令脚本

需求 编写一个定时任务脚本&#xff0c;实现每2个小时杀死名为aleo-miner的进程&#xff0c;并重新启动带有指定参数的./aleo.sh脚本 实现方案 使用cron作业结合一个shell脚本来完成这个任务。 操作步骤 第一步&#xff1a;编写Shell脚本 首先&#xff0c;你需要编写一个…

mysql在linux系统下重置root密码

mysql在linux系统下重置root密码 登录服务器时候mysql密码忘记了&#xff0c;没办法只能重置&#xff0c;找了一圈&#xff0c;把行之有效的方法介绍在这里。 错误展示&#xff1a; 我还以为yes就可以了呢&#xff0c;这是不行的意思。 关掉mysql服务 sudo systemctl stop …

C++ 类和对象 构造 / 析构函数

一 类的6个默认成员函数&#xff1a; 如果一个类中什么成员都没有&#xff0c;简称为空类。 例&#xff1a; #include <iostream> class Empty {// 空类&#xff0c;什么成员都没有 }; 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&a…

Day60 动态规划part13

LC647回文子串&#xff08;未掌握&#xff09; 暴力&#xff1a;两层for循环&#xff0c;遍历区间起始位置和终止位置&#xff0c;然后还需要一层遍历判断这个区间是不是回文。所以时间复杂度&#xff1a;O(n^3)dp数组含义 常规dp数组&#xff1a;题目求什么&#xff0c;我们…

Spring Boot集成rmi快速入门demo

1.什么是rmi&#xff1f; RMI&#xff08;Remote Method Invocation&#xff09;即远程方法调用&#xff0c;是分布式编程中的一个基本思想。实现远程方法调用的技术有很多&#xff0c;比如CORBA、WebService&#xff0c;这两种都是独立于各个编程语言的。 而Java RMI是专为Ja…

RedHat运维-Linux存储管理基础4-LVM的相关减小操作

1. /dev/sda1这个物理卷属于卷组vg1&#xff0c;并且卷组vg1有足够的物理卷成员&#xff0c;来承接/dev/sda1中的数据。现在要想将/dev/sda1移出卷组vg1&#xff0c;应该如何操作呢&#xff1f; 2. /dev/sda3这个物理卷属于卷组vg2&#xff0c;并且卷组vg2有足够的物理卷成员&a…

DNS隧道

dnscat2是一个DNS隧道工具&#xff0c;通过DNS协议创建加密的命令和控制通道&#xff0c;它的一大特色就是服务端会有一个命令行控制台&#xff0c;所有的指令都可以在该控制台内完成。包括:文件上传、下载、反弹Shell 目录 Dnscat2安装 解决bundle instal1特别慢问题 客户…

红外光气体检测:1.分子振动与红外吸收、检测系统的基本模型和红外敏感元件

分子振动与红外吸收 分子偶极矩的变化频率与分子内原子振动状态有关&#xff1a;μqd&#xff0c;其中μ是偶极矩&#xff0c;q是电荷&#xff0c;d是正负电荷中心距离。 分子在…

办公必备——ONLYOFFICE8.1版本桌面编辑器

一、介绍ONLYOFFICE ONLYOFFICE是一款免费的开源办公软件&#xff0c;它可以让你创建、编辑和分享文档、表格和演示文稿。就像微软的Office一样&#xff0c;但它是完全免费的&#xff0c;而且可以在多种设备上使用&#xff0c;包括电脑和手机。它还支持多人同时在线编辑文档&am…

7.8洛谷 字符串

P5650 基础字符串练习题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路 如果 S[i] 0&#xff0c;则 dp[i] max(dp[i-1] 1, 1)&#xff08;因为增加了 0&#xff0c;减少了 1&#xff09;。如果 S[i] 1&#xff0c;则 dp[i] max(dp[i-1] - 1, -1)&#xff08;因为减…

进程 VS 线程(javaEE篇)

&#x1f341; 个人主页&#xff1a;爱编程的Tom&#x1f4ab; 本篇博文收录专栏&#xff1a;JavaEE初阶&#x1f449; 目前其它专栏&#xff1a;c系列小游戏 c语言系列--万物的开始_ 等 &#x1f389; 欢迎 &#x1f44d;点赞✍评论⭐收藏&#x1f496;三连支…

在Openresty中将字符串按照下划线 _ ,分隔成两部分

在 OpenResty 中&#xff0c;可以使用 Lua 提供的字符串操作函数 string.match 或 ngx.re.match 来将字符串按照下划线 _ 分隔成两部分。下面是一个示例代码&#xff0c;展示如何实现这一功能&#xff1a; 使用 string.match 实现 http {server {listen 80;server_name local…

Open3D 从体素网格构建八叉树

目录 一、概述 1.1体素网格 1.2八叉树构建 1.3应用 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 3.1原始点云 3.2体素网格 3.3八叉树 3.4体素网格 一、概述 八叉树&#xff08;Octree&#xff09;是一种树状数据结构&#xff0c;用于递归地将三维空间划分为…

探展2024世界人工智能大会之令人惊艳的扫描黑科技~

文章目录 ⭐️ 前言⭐️ AIGC古籍修复文化遗产焕新⭐️ 高效的文档图像处理解决方案⭐️ AIGC扫描黑科技一键全搞定⭐️ 行业级的知识库大模型加速器⭐️ 结语 ⭐️ 前言 大家好&#xff0c;我是 哈哥&#xff08;哈哥撩编程&#xff09;&#xff0c;这次非常荣幸受邀作为专业…

# Redis 入门到精通(一)数据类型(1)

Redis 入门到精通&#xff08;一&#xff09;数据类型&#xff08;1&#xff09; 一 、Redis 入门到精通 基本介绍 1、Redis 基础 ( windows 环境 ) redis 入门数据类型通用命令Jedis 2、Redis 高级 ( linux 环境 ) 持久化redis.conf 配置事务集群 3、Redis 应用 ( linux…

React -- useState状态更新异步特性——导致获取值为旧值的问题

useState状态异步更新 问题导致的原因解决办法进一步分析后续遇到的新问题 问题 const [isSelecting, setIsSelecting] useState(false);useEffect(() > {const handleKeyDown (event) > {if (event.key Escape) {if(isSelectingRef){//.......setIsSelecting(!isSele…

封装了一个仿照抖音效果的iOS评论弹窗

需求背景 开发一个类似抖音评论弹窗交互效果的弹窗&#xff0c;支持滑动消失&#xff0c; 滑动查看评论 效果如下图 思路 创建一个视图&#xff0c;该视图上面放置一个tableView, 该视图上添加一个滑动手势&#xff0c;同时设置代理&#xff0c;实现代理方法 (BOOL)gestur…

如何理解JavaScript代理对象(JavaScript Proxy)

JavaScript的Proxy对象是一种强大且灵活的特性&#xff0c;它允许你拦截并自定义对对象执行的操作。自ECMAScript 6&#xff08;ES6&#xff09;引入以来&#xff0c;Proxy对象为控制对象的基本操作行为提供了一种机制&#xff0c;使高级用例和改进的安全性成为可能。 代理对象…

HNTs-g-PEG-CDs-Biotin NPs;碳量子点修饰接枝生物素化的羟基磷灰石纳米管

HNTs-g-PEG-CDs-Biotin NPs&#xff0c;即碳量子点修饰接枝生物素化的羟基磷灰石纳米管&#xff0c;是一种结合了多种先进材料特性的纳米复合材料。以下是对该材料的详细分析&#xff1a; 一、组成成分及特性 羟基磷灰石纳米管&#xff08;HNTs&#xff09;&#xff1a; 羟基磷…