深入剖析Java反射机制:解锁高级编程技巧,事半功倍

news2024/9/23 7:32:46

前言

  • 在 Java中,反射机制(Reflection)非常重要,但对于很多开发者来说,这并不容易理解,甚至觉得有点神秘

目录

fca1043abedf01b47d4cb9b622692589.jpeg

1. 简介

  • 定义:Java语言中 一种 动态(运行时)访问、检测 & 修改它本身的能力
  • 作用:动态(运行时)获取类的完整结构信息 & 调用对象的方法
  • 类的结构信息包括:变量、方法等
  • 正常情况下,Java类在编译前,就已经被加载到JVM中;而反射机制使得程序运行时还可以动态地去操作类的变量、方法等信息

2. 特点

2.1 优点

灵活性高。因为反射属于动态编译,即只有到运行时才动态创建 &获取对象实例。

编译方式说明:

1. 静态编译:在编译时确定类型 & 绑定对象。如常见的使用new关键字创建对象

2. 动态编译:运行时确定类型 & 绑定对象。动态编译体现了Java的灵活性、多态特性 & 降低类之间的藕合性

2.2 缺点

  • 执行效率低
  • 因为反射的操作 主要通过JVM执行,所以时间成本会 高于 直接执行相同操作
  • 因为接口的通用性,Java的invoke方法是传object和object[]数组的。基本类型参数需要装箱和拆箱,产生大量额外的对象和内存开销,频繁促发GC。
  • 编译器难以对动态调用的代码提前做优化,比如方法内联。
  • 反射需要按名检索类和方法,有一定的时间开销。
  • 容易破坏类结构
  • 因为反射操作饶过了源码,容易干扰类原有的内部逻辑

3. 应用场景

  • 动态获取 类文件结构信息(如变量、方法等) & 调用对象的方法
  • 常用的需求场景有:动态代理、工厂模式优化、Java JDBC数据库操作等

下文会用实际例子详细讲解

4. 具体使用

4.1 Java反射机制提供的功能

9aeb5b63e05f90c38df039ab330351c7.jpeg

4.2 实现手段

  • 反射机制的实现 主要通过 操作java.lang.Class类
  • 下面将主要讲解 java.lang.Class 类

4.2.1 java.lang.Class 类

定义:java.lang.Class类是反射机制的基础

作用:存放着对应类型对象的 运行时信息

22e8d70af1a687b3c9b7f06f1b1fffe6.jpeg

每种类型的Class对象只有1个 = 地址只有1个

48d95e3ed1cacdd14626c4ba45694866.jpeg

Java反射机制的实现除了依靠Java.lang.Class类,还需要依靠:Constructor类、Field类、Method类,分别作用于类的各个组成部分:

ecdf96a512f1800e1a4aceb7b85b4f79.jpeg

4.3 使用步骤

在使用Java反射机制时,主要步骤包括:

1. 获取 目标类型的Class对象

2. 通过 Class 对象分别获取Constructor类对象、Method类对象 & Field 类对象

3. 通过 Constructor类对象、Method类对象 & Field类对象分别获取类的构造函数、方法&属性的具体信息,并进行后续操作

下面,我将详细讲解每个步骤中的使用方法。

步骤1:获取 目标类型的Class对象

8323e129a6c0ad3be2648c5cc38eadfc.jpeg

此处额外讲一下java.lang.reflect.Type类

  • java.lang.reflect.Type是 Java中所有类型的父接口
  • 这些类型包括:
7ee18c442cfd3527ad622f6b472f62bc.jpeg
  • 之间的关系如下
e6df7a481f253d978943f4e5b415bc2f.jpeg

步骤2:通过 Class 对象分别获取Constructor类对象、Method类对象 & Field 类对象

54fc64d6e60aeb6714ae698d5f96db2f.jpeg c1035f2fb45f9cf3f967cc30e82cb107.jpeg

步骤3:通过 Constructor类对象、Method类对象 & Field类对象分别获取类的构造函数、方法 & 属性的具体信息 & 进行操作

5d967718af28874812306398af27eae6.jpeg

至此,关于Java反射机制的步骤说明已经讲解完毕。

4.4 特别注意:访问权限问题

  • 背景

反射机制的默认行为受限于Java的访问控制

如,无法访问( private )私有的方法、字段

  • 冲突

Java安全机制只允许查看任意对象有哪些域,而不允许读它们的值

若强制读取,将抛出异常

  • 解决方案

脱离Java程序中安全管理器的控制、屏蔽Java语言的访问检查,从而脱离访问控制

  • 具体实现手段:使用Field类、Method类 & Constructor类对象的setAccessible()
0a2261357bd7a4dc5fc4003573422e39.jpeg 1912f3bb0d4c9405fd887f61c203173d.jpeg

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

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

相关文章

docker安装minio作为图床服务

minio官网:MinIO | 高性能分布式存储,私有云存储 适用于AI的高性能分布式云存储,MinIO提供高性能、与S3 兼容的对象存储系统,让你自己能够构建自己的私有云储存服务。 MinIO原生支持 Kubernetes,它可用于每个独立的公…

迅为itop-3568开发板qt学习手册上新

基于RK3568的QT教程他来了~从C基础到QT编程实例再到项目实战,《iTOP-3568开发板QT学习手册》带你打通QT的任督二脉。 界面布局 3.5.1 水平布局 l Horizontal Layout:水平方向布局,组件自动在水平方向上分布 使用时先选中组件&#xff0…

外卖霸王餐系统 支持小程序,分站合作

它终于出来啦!微客云分站终于正式发布!!📣📣📣 先前的文章就已经预告过微客云要搞分站,很多小伙伴们一直在问老许分站什么时候出来,想加盟分站怎么做?有什么条件&#xf…

部署:端口映射相关问题

图片仅作示意用途 在很多现场部署环境里,网络管理是相对严格的,设备所在的子网如果需要和办公网所在的服务器通讯,需要通过专门的中间节点,一般还有严格的防火墙配置。此时,研发环境里,服务器与设备子网各…

【Python3】【力扣题】136. 只出现一次的数字

【力扣题】题目描述: 【Python3】代码: 1、解题思路:遍历列表元素,查看该元素在列表中共有多少个,返回个数为1的元素。 知识点:列表.count(...):统计列表中某元素个数。 class Solution:def …

【实战项目】高并发内存池(下)

我们上篇文章(高并发内存池(上))介绍了向高并发内存池申请资源的整个过程,本篇文章我们将会对申请后的空间资源释放的整个流程。同时也会对我们自己实现的内存池进行性能测试和优化。 文章目录 一、thread cache 回收资…

CentOS 7 安装和配置java环境

1 安装包准备 安装包可以通过下面地址进行版本选择安装: https://www.oracle.com/java/technologies/downloads/#java8 2 正式开始安装 本次分享的安装方法直接通过编辑/etc/profile文件实现java的安装 2.1 新建安装包存放目录 mkdir /java cd /java/ 2.2 解压安…

Mac电脑窗口管理Magnet中文 for mac

Magnet是一款Mac窗口管理工具,它可以帮助用户轻松管理打开的窗口,提高多任务处理效率。以下是Magnet的一些主要特点和功能: 分屏模式支持:Magnet支持多种分屏模式,包括左/右/顶部/底部 1/2 分屏、左/中/右 1/3 分屏、…

分享一下怎么做一个投票小程序链接

在这个数字化时代,微信小程序已经成为了我们生活中不可或缺的一部分。而投票小程序链接,更是具有广泛的应用场景和巨大的市场潜力。本文将详细介绍如何制作一个投票小程序链接,帮助大家了解其意义、设计思路、实现方法、亮点突出以及如何推广…

【notion enhancer安装】一个强大的笔记软件,可以实现侧边目录的notion

官网地址: https://notion-enhancer.github.io/getting-started/installation/ 介绍 众所周知,notion作为一款强大的笔记软件,深受广大uu的热爱。但是在使用普通版本的时候 ,notion不能实现目录的侧边导航,对于很长的…

MyBatis Plus公共字段自动填充

MyBatis Plus公共字段自动填充,也就是在插入或者更新的时候为指定字段赋予指定的值,使用它的好处就是可以统一对这些字段进行处理,避免了重复代码。 例如,像每个table中都有createTime,createUser,updateTime,updateUser这些字段…

信奥赛一本通算法 第二章数据排序(【例2.2】车厢重组、谁考了第k名、奇数单增序列、成绩排序、奖学金、分数线划定、整数奇偶排序)

数据算法 1310:【例2.2】车厢重组1176:谁考了第k名1177:奇数单增序列1178:成绩排序1179:奖学金1180:分数线划定1181:整数奇偶排序 1310:【例2.2】车厢重组 这道题简单,题…

黑马头条:app端文章查看

黑马头条:app端文章查看 黑马头条:app端文章查看文章列表加载1. 需求分析2. 表结构分析3. 导入文章数据库3.1 导入数据库3.2 导入对应的实体类 4. 实现思路5. 接口定义6. 功能实现6.1:导入heima-leadnews-article微服务,资料在当天…

无线通信的未来:WiFi HaLow的低功耗、超长距离革命

WiFi HaLow,一项创新性的Wi-Fi协议,致力于解决不断增长的物联网需求,兼具低功耗和超长距离覆盖的特点。建立在IEEE 802.11ah标准的基础上,WiFi HaLow为物联网开发者提供了全方位的无线解决方案,以满足他们对能源效率、…

Python报错:‘EagerTensor‘ object has no attribute ‘reshape‘

在使用RPython时,发现python代码部分报错:‘EagerTensor‘ object has no attribute ‘reshape‘ 如何解决? 使用np.array 转换为array,再进行reshape 参考: ‘EagerTensor‘ object has no attribute ‘reshape‘处…

由浅入深,详细总结 Spring 八种加载 Bean 的方式

文章目录 方式一:XML 方式声明 bean方式二:XML 注解方式声明 bean方式三:注解方式声明配置类扩展一:Bean 返回的对象和真实 Bean 对象可能不是一个扩展二:加载配置类的同时,加载配置文件(系统迁…

堆体扫描点云体积计算实现思路分享

做了一个初步的 demo 实验, 计算一堆沙子或者煤堆这种物体的扫描点云的体积 思路就是分块计算每个小的立方体的体积,然后累加,wechat 394467238, 具体的实现细节略微麻烦一点,代码暂时不放了

C# 压缩图片

.net下跨平台图像处理 https://github.com/mono/SkiaSharp 安装包 skiasharp 效果 代码 ImageCompression.cs using SkiaSharp;namespace ImageCompressStu01 {/// <summary>/// 图片压缩/// </summary>public class ImageCompression{/// <summary>/…

Mysql第四篇---数据库索引优化与查询优化

文章目录 数据库索引优化与查询优化索引失效案例数据准备1. 全值匹配2 最佳左前缀法则(联合索引)主键插入顺序4 计算、函数导致索引失效5 类型转换(自动或手动)导致索引失效6 范围条件右边的列索引失效7 不等于(!或者<>)索引失效8 is null可以使用索引, is not null无法使…

数据结构之栈的讲解(源代码+图解+习题)

我们在学习过顺序表和链表之后&#xff0c;了解了使用数组存储数据&#xff0c;使用结构体来存储数据和有关的指针&#xff0c;这些都是底层的东西&#xff0c;链表是靠指针的链接&#xff0c;顺序表是靠数组的下标才能得以实现增删查改。众多数据结构其实底层都离不开数组&…