技术总结(十一)

一、反射是什么

反射之所以被称为框架的灵魂,主要是因为它赋予了我们在运行时分析类以及执行类中方法的能力。通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性

二、反射的优缺点有那些

反射的优点

  • 高度的灵活性

反射允许在运行时动态地操作类和对象,这在很多场景下提供了极大的灵活性。例如,在开发插件系统或者动态加载模块时,通过反射可以根据配置文件或者用户输入来加载不同的类,调用其方法,而不需要在编译时就确定所有要使用的类。

  • 有利于框架的构建

反射是很多框架的核心机制。框架通常需要对应用程序中的类进行统一的管理和操作,反射使得框架能够自动地发现和加载类,设置对象的属性和调用方法。以 Spring 框架为例,它通过反射扫描配置文件或者带有特定注解的类,自动创建对象并注入依赖关系。这大大简化了应用程序的开发,开发者只需要按照框架的规范编写业务逻辑类,框架就可以通过反射自动地将这些类组合起来,形成一个完整的应用程序。

反射的缺点

  • 性能问题

反射操作通常比直接的代码调用要慢。因为反射涉及到在运行时动态地解析类结构、查找方法和属性等操作。例如,在 Java 中,通过反射调用一个方法,需要经过一系列的步骤,如查找方法对象、检查方法的访问权限、包装参数等,这些操作都会产生额外的开销。相比之下,直接调用一个已经编译确定的方法,编译器和虚拟机可以进行更多的优化,如内联方法等,从而提高执行效率。在性能要求较高的场景下,频繁地使用反射可能会导致程序性能下降。

  • 安全限制

反射可能会绕过语言的访问控制机制

  • 代码可读性和可维护性降低

反射代码通常比直接的代码更复杂、更难理解。由于反射涉及到在运行时动态地操作类和对象,代码的逻辑可能会变得晦涩难懂。例如,在一个大型的应用程序中,如果大量使用反射来加载类和调用方法,开发人员在阅读代码时可能需要花费更多的时间来理解反射代码的意图。而且,当程序出现问题时,调试反射代码也会更加困难,因为反射操作的结果可能会受到运行时环境的多种因素的影响。

三、如何使用反射来提高代码的可读性和可维护性?

  1. 合理的代码结构与注释
    • 封装反射操作
      • 将反射相关的操作封装到独立的工具类或方法中是一个很好的做法。例如,在 Java 中创建一个名为ReflectionUtils的工具类,把获取类的属性、方法以及调用方法等反射操作都放在这个类中。这样,在其他代码中,只需要调用这个工具类的方法,而不需要看到复杂的反射细节。例如:
     import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.List;public class ReflectionUtils {public static List<Field> getAllFields(Class<?> clazz) {List<Field> fields = new ArrayList<>();Class<?> currentClass = clazz;while (currentClass!= null) {Field[] declaredFields = currentClass.getDeclaredFields();for (Field field : declaredFields) {fields.add(field);}currentClass = currentClass.getSuperclass();}return fields;}public static Method getMethod(Class<?> clazz, String methodName, Class<?>... parameterTypes) throws NoSuchMethodException {return clazz.getMethod(methodName, parameterTypes);}}
  • 对于这些工具方法,可以添加详细的注释来解释它们的功能和用途。比如在getAllFields方法的注释中,可以说明它会获取指定类及其所有父类的所有属性,并将它们存储在一个List中返回。这样,其他开发人员在使用这个方法时,不需要深入了解反射的具体细节,就能清楚地知道这个方法的作用。

  1. 遵循设计模式使用反射
    • 工厂模式与反射结合
      • 工厂模式可以利用反射来动态地创建对象。例如,假设有一个图形绘制应用,有不同的图形类(如CircleRectangle等),这些图形类都实现了一个Shape接口。可以创建一个ShapeFactory类,通过反射根据传入的类名来创建相应的图形对象。
     public class ShapeFactory {public static Shape createShape(String shapeClassName) {try {Class<?> clazz = Class.forName(shapeClassName);return (Shape) clazz.newInstance();} catch (Exception e) {e.printStackTrace();return null;}}}

  • 这种方式提高了代码的可维护性,因为如果需要添加新的图形类,只需要确保它实现了Shape接口,并且在需要创建图形对象的地方,通过传入新图形类的全限定名就可以创建相应的对象,而不需要修改工厂类的核心创建逻辑。同时,代码的可读性也较好,因为工厂模式本身是一种广为人知的设计模式,开发人员可以很容易地理解这种通过类名来创建对象的方式。

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

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

相关文章

GRU神经网络理解

全文参考以下B站视频及《神经网络与深度学习》邱锡鹏&#xff0c;侧重对GPU模型的理解&#xff0c;初学者入门自用记录&#xff0c;有问题请指正【重温经典】GRU循环神经网络 —— LSTM的轻量级版本&#xff0c;大白话讲解_哔哩哔哩_bilibili 更新门、重置门、学习与输出 注&a…

STM32(二十一):看门狗

WDG&#xff08;Watchdog&#xff09;看门狗&#xff0c;手动重装寄存器的操作就是喂狗。 看门狗可以监控程序的运行状态&#xff0c;当程序因为设计漏洞、硬件故障、电磁干扰等原因&#xff0c;出现卡死或跑飞现象时&#xff0c;看门狗能及时复位程序&#xff0c;避免程序陷入…

数学建模微分方程模型——传染病模型

病毒也疯狂&#xff1a;细说传染病微分方程模型的那些事儿 “数学是打开科学大门的钥匙&#xff0c;而微分方程则是理解世界变化的密码。” 大家好&#xff01;今天我们要聊一聊一个既严肃又有趣的话题——传染病微分方程模型。别急&#xff0c;听起来高大上&#xff0c;其实一…

亚信安全DeepSecurity中标知名寿险机构云主机安全项目

近日&#xff0c;亚信安全DeepSecurity成功中标国内知名寿险机构的云主机安全项目。亚信安全凭借在云主机安全防护领域的突出技术优势&#xff0c;结合安全运营的能力&#xff0c;以“实战化”为指导&#xff0c;为用户提供无惧威胁攻击、无忧安全运营的一站式云安全体系&#…

【论文翻译】ICLR 2018 | DCRNN:扩散卷积递归神经网络:数据驱动的交通预测

论文题目Diffusion Convolutional Recurrent Neural Network: Data-Driven Traffic Forecasting论文链接https://arxiv.org/abs/1707.01926源码地址https://github.com/liyaguang/DCRNN发表年份-会议/期刊2018 ICLR关键词交通预测&#xff0c;扩散卷积&#xff0c;递归神经网络…

数字+文旅:AI虚拟数字人如何焕发传统文旅景区新活力?

​​引言&#xff1a; 据《2024年中国数字文旅行业市场研究报告》显示&#xff0c;截至2022年&#xff0c;中国数字文旅市场规模已达到约9698.1亿元人民币&#xff0c;相较于2017年的7870.5亿元&#xff0c;实现了57.89%的显著增长。这一行业涵盖了数字化的文化遗产旅游、虚拟…

JVM、字节码文件介绍

目录 初识JVM 什么是JVM JVM的三大核心功能 JVM的组成 字节码文件的组成 基础信息 Magic魔数 主副版本号 其它基础信息 常量池 字段 方法 属性 字节码常用工具 javap jclasslib插件 阿里Arthas 初识JVM 什么是JVM JVM的三大核心功能 1. 解释和运行虚拟机指…

【性能优化】安卓性能优化之CPU优化

【性能优化】安卓性能优化之CPU优化 CPU优化及常用工具原理与文章参考常用ADB常用原理、监控手段原理监控手段多线程并发解决耗时UI相关 常见场景排查CPU占用过高常用系统/开源分析工具AndroidStudio ProfilerSystraceBtracePerfettoTraceView和 Profile ANR相关ANR原理及常见场…

使用 VSCode 通过 Remote-SSH 连接远程服务器详细教程

使用 VSCode 通过 Remote-SSH 连接远程服务器详细教程 在日常开发中&#xff0c;许多开发者需要远程连接服务器进行代码编辑和调试。Visual Studio Code&#xff08;VSCode&#xff09;提供了一个非常强大的扩展——Remote-SSH&#xff0c;它允许我们通过 SSH 协议直接连接远程…

YOLO V3 网络构架解析

YOLO V3&#xff08;You Only Look Once version 3&#xff09;是由Joseph Redmon等人于2018年提出的一种基于深度学习的目标检测算法。它在速度和精度上相较于之前的版本有了显著提升&#xff0c;成为计算机视觉领域的一个重要里程碑。本文将详细解析YOLO V3的网络架构&#x…

【信息论基础第六讲】离散无记忆信源等长编码包括典型序列和等长信源编码定理

一、信源编码的数学模型 我们知道信源的输出是消息序列&#xff0c;对于信源进行编码就是用码字集来表示消息集&#xff0c;也就是要进行从消息集到码字集的映射。 根据码字的特征我们又将其分为D元码&#xff0c;等长码&#xff0c;不等长码&#xff0c;唯一可译码。 我们通过…

通过DevTools逃离Chrome沙盒(CVE-2024-6778和CVE-2024-5836)

介绍 这篇博文详细介绍了如何发现CVE-2024-6778和CVE-2024-5836的&#xff0c;这是Chromium web浏览器中的漏洞&#xff0c;允许从浏览器扩展&#xff08;带有一点点用户交互&#xff09;中进行沙盒逃逸。 简而言之&#xff0c;这些漏洞允许恶意的Chrome扩展在你的电脑上运行…

npm run serve 提示异常Cannot read property ‘upgrade‘ of undefined

npm run serve 提示Cannot read property ‘upgrade’ of undefined 一般是proxy的target代理域名问题导致的&#xff0c;如下&#xff1a; 解决方案&#xff1a; proxy: { “/remoteDealerReportApi”: { target: ‘http://demo-.com.cn’, //此域名有问题&#xff0c;会导致…

Linux-基础命令及相关知识2

补充&#xff1a; 1、A命令&#xff08;echo&#xff09;既有可能是内部命令也有可能是外部命令&#xff0c;例如命令A既有可能在bash上也有可能在csh上&#xff0c;为了防止A在某些shell程序里不起作用&#xff0c;可以将A命令设置为外部命令&#xff08;环境变量路径上&…

【JAVA毕设】基于JAVA的酒店管理系统

一、项目介绍 本系统前端框架采用了比较流行的渐进式JavaScript框架Vue.js。使用Vue-Router实现动态路由&#xff0c;Ajax实现前后端通信&#xff0c;Element-plus组件库使页面快速成型。后端部分&#xff1a;采用SpringBoot作为开发框架&#xff0c;同时集成MyBatis、Redis、…

Chrome DevTools:Console Performance 汇总篇

Chrome DevTools Chrome 开发者工具是一套 Web 开发者工具&#xff0c;直接内置于 Google Chrome 浏览器中。 开发者工具可以帮助您即时修改页面和快速诊断问题&#xff0c;最终帮助您更快地构建更好的网站。 一、开启 DevTools 右上角菜单 > 更多工具 > 开发者工具 页面…

如何用mmclassification训练多标签多分类数据

这里使用的源码版本是 mmclassification-0.25.0 训练数据标签文件格式如下&#xff0c;每行的空格前面是路径&#xff08;图像文件所在的绝对路径&#xff09;&#xff0c;后面是标签名&#xff0c;因为特殊要求这里我的每张图像都记录了三个标签每个标签用“,”分开&#xff0…

力扣71~75题

题71&#xff08;中等&#xff09;&#xff1a; python代码&#xff1a; class Solution:def simplifyPath(self, path: str) -> str:#首先根据/分割字符串&#xff0c;再使用栈来遍历存储p_listpath.split(/)p_stack[]for i in p_list:#如果为空则肯定是//或者///if i:con…

mac m1 安装openresty以及redis限流使用

一切源于一篇微信文章 早上我上着班&#xff0c;听着歌1.打算使用腾讯云服务器centos-7实验&#xff1a;安装ngx_devel_kitmac m1 os 12.7.6 安装openresty测试lua限流: 终于回到初心了&#xff01; 早上我上着班&#xff0c;听着歌 突然微信推送了一篇文章《Nginx 实现动态封…

记录一次从nacos配置信息泄露到redis写计划任务接管主机

经典c段打点开局。使用dddd做快速的打点发现某系统存在nacos权限绕过 有点怀疑是蜜罐&#xff0c;毕竟nacos这实在是有点经典 nacos利用 老规矩见面先上nacos利用工具打一波看看什么情况 弱口令nacos以及未授权访问&#xff0c;看这记录估计被光顾挺多次了啊 手动利用Nacos-…