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

什么是反射机制?为什么反射慢?

目录

面试回答

知识扩展

反射常见的使用方式

反射和 Class 的关系


面试回答

反射指的是程序在运行时能够获取自身的信息。在 java 中,只要给定类的名字,那么就可以通过反射机制来获得类的所有属性和方法。

Java 的反射可以:

  1. 在运行时判断任意一个对象所属的类
  2. 在运行时判断任意一个类所具有的成员变量和方法
  3. 在运行时任意调用一个对象的方法
  4. 在运行时构造任意一个类的对象

反射的好处就是可以提升程序的灵活性和扩展性,比较容易在运行期干很多事情。但是他带来的问题更多,主要有以下几个:

  1. 代码可读性低及可维护性
  2. 反射代码执行的性能低
  3. 反射破坏了封装性

所以,我们应该在业务代码中应该尽量避免使用反射。但是,作为一个合格的 Java 开发,也要能读懂中间件、框架中的反射代码。在有些场景下,要知道可以使用反射解决部分问题。

那么,反射为什么慢呢?主要由以下几个原因:

  1. 由于反射涉及动态解析的类型,因此不能执行某些 Java 虚拟机优化,如 JIT 优化。
  2. 在使用反射时,参数需要包装(boxing)成 Object[] 类型,但是真正方法执行胡时候,又需要再拆包(unboxing)成真正的类型,这些动作不仅消耗时间,而且过程中也会产生很多对象,对象一多就容易导致 GC,GC 也会导致应用变慢。
  3. 反射调用方法时会从方法数组中遍历查找,并且会检查可见性。这些动作都是耗时的。
  4. 不仅方法的可见性要做检查,参数也需要做很多额外的检查。

知识扩展

反射常见的使用方式

  1. 动态代理
  2. JDBC 的 class.forName
  3. BeanUtils 中属性值的拷贝
  4. RPC 框架
  5. ORM 框架
  6. Spring 的 OC/DI

反射和 Class 的关系

Java 的 Class 类是 java 反射机制的基础,通过 Class 类我们可以获得关于一个类的相关信息。

Java.lang.Class 是一个比较特殊的类,它用于封装被装入到 JVM 中的类(包括类和接口)的信息。当一个类或接口被装入的 JVM 时便会产生一个与之关联的 java.lang.Class 对象,可以通过这个 Class 对象对被装入类的详细信息进行访问。

虚拟机为每种类型管理一个独一无二的 Class 对象。也就是说,每个类(型)都有一个 Class 对象。运行程序时,Java 虚拟机(JVM)首先检查所要加载的类对应的 Class 对象是否已经加载。如果没有加载,JVM 就会根据类名查找 .class 文件,并将其 Class 对象载入。

相关文章:

什么是反射机制?为什么反射慢?

目录 面试回答 知识扩展 反射常见的使用方式 反射和 Class 的关系 面试回答 反射指的是程序在运行时能够获取自身的信息。在 java 中,只要给定类的名字,那么就可以通过反射机制来获得类的所有属性和方法。 Java 的反射可以: 在运行时判断…...

list元素

列表元素 列表元素分为有序列表和无序列表 有序列表 ol – order list – 有序列表 li – list item – 列表元素 <ol type"1"><li>有序列表1</li><li>有序列表2</li><li>有序列表3</li> </ol>属性 type type属…...

OkHttp 源码浅析一

演进之路:原生Android框架不好用 ---- HttpUrlConnect 和 Apache HTTPClient 第一版 底层使用HTTPURLConnect 第二版 Square构建 从Android4.4开始 基本使用: val okhttp OkHttpClient()val request Request.Builder().url("http://www.baidu.com").buil…...

【解决问题】远程仓库GitHub/GitLab添加了SSH Key之后依然无法clone的解决办法

GitHub/GitLab添加了SSH Key之后依然无法clone的解决办法 问题现象解决办法 问题现象 在Git远程仓库添加了自己的ssh key到账户下&#xff0c;git clone时&#xff0c;依然报错clone失败&#xff0c;请检查是否没有权限进行clone操作。 解决办法 在git的安装目录下&#xff…...

回归预测 | MATLAB实现SA-SVM模拟退火算法优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现SA-SVM模拟退火算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现SA-SVM模拟退火算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本…...

Spring事务和事务传播机制(1)

前言&#x1f36d; ❤️❤️❤️SSM专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ Spring Spring MVC MyBatis_冷兮雪的博客-CSDN博客 在Spring框架中&#xff0c;事务管理是一种用于维护数据库操作的一致性和…...

如何快速在vscode中实现不同python文件的对比查看

总体而言&#xff1a;两种方式。一种是直接点击vscode右上角的图标&#xff08;见下图&#xff09;。 另一种方式就是使用快捷键啦“**Ctrl**”&#xff0c;用的时候选中想要对比的python文件&#xff0c;然后快捷键就可以达到下图效果了&#xff1a; 建议大家直接使用第二种…...

网络安全---Ring3下动态链接库.so函数劫持

一、动态链接库劫持原理 1.1、原理 Unix操作系统中&#xff0c;程序运行时会按照一定的规则顺序去查找依赖的动态链接库&#xff0c;当查找到指定的so文件时&#xff0c;动态链接器(/lib/ld-linux.so.X)会将程序所依赖的共享对象进行装载和初始化&#xff0c;而为什么可以使用…...

leetcode283. 移动零

难度&#xff1a;简单题 题目 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 思路&#xff1a; 一开始想&#xff0c;从前往后遍历&am…...

GuLi商城-前端基础Vue-生命周期和钩子函数

下图展示了实例的生命周期。你不需要立马弄明白所有的东西&#xff0c;不过随着你的不断学习和使用&#xff0c;它 的参考价值会越来越高。 VUE 的生命周期指的是组件在创建、运行和销毁过程中所经历的一系列事件&#xff0c;通过这些事件可以 让开发者在不同阶段进行相应的…...

输入输出+暴力模拟入门:魔法之树、染色の树、矩阵、字母加密、玫瑰鸭

秋招实习刷题网站推荐&#xff1a;codefun2000.com&#xff0c;还有题解博客&#xff1a;blog.codefun2000.com/。以下内容都是来自塔子哥的~ 输入输出 2023.04.15-春招-第三题-魔法之树 //#include<bits/stdc.h> #include<vector> #include<iostream>usin…...

​Kubernetes的演变:从etcd到分布式SQL的过渡

DevRel领域专家Denis Magda表示&#xff0c;他偶然发现了一篇解释如何用PostgreSQL无缝替换etcd的文章。该文章指出&#xff0c;Kine项目作为外部etcd端点&#xff0c;可以将Kubernetes etcd请求转换为底层关系数据库的SQL查询。 受到这种方法的启发&#xff0c;Magda决定进一步…...

29、简单通过git把项目远程提交到gitee

简单通过git把项目远程提交到gitee 1、在gitee上创建一个仓库 2、在要提交的项目文件夹打开git 输入 git init 初始化git 然后设置下用户名和邮箱 git config --global user.name “username” git config --global user.email “yourEmail” 因为我是要把文件简单提交到…...

元宇宙之应用(04)沉浸式游戏

在数字科技迅猛发展的今天&#xff0c;元宇宙的概念正逐渐从科幻走向现实&#xff0c;重新定义了人们与虚拟世界的交互方式。在这一概念的引领下&#xff0c;"沉浸式游戏" 蓬勃发展&#xff0c;为游戏体验带来了前所未有的深度和广度。那么&#xff0c;为什么沉浸式游…...

浙大数据结构第八周之08-图7 公路村村通

题目详情&#xff1a; 现有村落间道路的统计数据表中&#xff0c;列出了有可能建设成标准公路的若干条道路的成本&#xff0c;求使每个村落都有公路连通所需要的最低成本。 输入格式: 输入数据包括城镇数目正整数N&#xff08;≤1000&#xff09;和候选道路数目M&#xff08…...

SpringBoot 解决跨域问题

同源策略&#xff08;CORS&#xff09;&#xff1a;浏览器在解析发送的请求时&#xff0c;要求浏览器的路径与发送的请求的路径必须满足三个要求&#xff0c;即请求的协议、域名、端口号都相同&#xff0c;满足同源策略&#xff0c;才可以访问服务器&#xff0c;否则&#xff0…...

2023 年牛客多校第十场题解

C Multiplication 题意&#xff1a;定义 k k k-shift 数是满足 k x y ‾ y x ‾ k\overline{xy}\overline{yx} kxy​yx​ 的数字。给定 k k k&#xff0c;求最大不超过 n n n 的 k k k-shift 数。 1 ≤ n ≤ 1 0 100 1 \le n \le 10^{100} 1≤n≤10100&#xff0c; 2 ≤…...

韦东山老师 RTOS 入门课程(一)RTOS 介绍,熟悉裸机的汇编逻辑

韦东山老师 RTOS 入门课程 课程链接&#xff1a;韦东山直播公开课&#xff1a;RTOS实战项目之实现多任务系统 第1节&#xff1a;裸机程序框架和缺陷_哔哩哔哩_bilibili RTOS 介绍 裸机&#xff1a;固定顺序执行。 中断&#xff1a;可以一直专心做循环里的事情&#xff0c;直…...

WebRTC | SDP详解

目录 一、SDP标准规范 1. SDP结构 2. SDP内容及type类型 二、WebRTC中的SDP结构 1. 媒体信息描述 &#xff08;1&#xff09;SDP中媒体信息格式 i. “artpmap”属性 ii. “afmtp”属性 &#xff08;2&#xff09;SSRC与CNAME &#xff08;3&#xff09;举个例子 &…...

Springboot 实践(9)springboot集成Oauth2.0授权包,5个接口文件配置详解

前文讲解实现了spring boot集成Oauth2.0&#xff0c;实现了授权服务器和资源服务器的搭建&#xff0c;并通过浏览器和postman测试&#xff0c;获取到了授权码&#xff0c;用携带授权码的URL能够争取范文到资源。 本文详细讲解spring boot集成Oauth2.0的几个重要文件接口&#…...

还在用高斯牛顿法?看看有全局最优保证的求解器!

点击下方卡片&#xff0c;关注「3D视觉工坊」公众号选择星标&#xff0c;干货第一时间送达3D视觉工坊很荣幸邀请到了西湖大学与浙江大学联合培养项目的博士生三年级研究生廖邦彦&#xff0c;为大家着重分享他们团队的工作。如果您有相关内容需要分享&#xff0c;欢迎文末联系我…...

收藏这篇就够了!新手学习 Kali Linux 全指南,避开九成弯路从入门到实战

前言&#xff1a; 当你花了 2 个小时在虚拟机里装好了 Kali Linux—看到屏幕上弹出黑色的终端界面&#xff0c;光标闪烁着 “rootkali:~#” 时&#xff0c;你会不会慌乱&#xff1f;接下来该输什么命令&#xff1f;这些工具怎么用&#xff1f;网上说的 “用 Kali 挖漏洞”&…...

NocoDB企业数据管理平台:如何用可视化数据库解决业务协作难题

NocoDB企业数据管理平台&#xff1a;如何用可视化数据库解决业务协作难题 【免费下载链接】nocodb &#x1f525; &#x1f525; &#x1f525; A Free & Self-hostable Airtable Alternative 项目地址: https://gitcode.com/GitHub_Trending/no/nocodb 在数字化转型…...

当代酷刑:如厕等信号

如厕等信号&#xff0c;属于当代十大酷刑之一。作为社会观察理性分析的结合体&#xff0c;今天&#xff0c;我想写一些这物理世界的墙&#xff0c;也是这消费世界的墙。你有没有过这样的感受&#xff1f;不管你家里换了多么厉害的宽带&#xff0c;多么高端前沿的路由器&#xf…...

从《现代微波滤波器》到CoupleFila:手把手教你打通耦合矩阵‘理论-软件-ADS’全链路

从理论到实践&#xff1a;耦合矩阵设计与ADS验证全流程指南 微波滤波器设计一直是射频工程师面临的核心挑战之一&#xff0c;而耦合矩阵作为设计过程中的关键工具&#xff0c;其重要性不言而喻。然而&#xff0c;许多初学者在接触这一领域时&#xff0c;往往被各种理论公式、计…...

从开发者控制台直观感受Taotoken的用量监控与审计功能

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 从开发者控制台直观感受Taotoken的用量监控与审计功能 对于依赖大模型API构建应用的开发者而言&#xff0c;清晰、及时地掌握资源消…...

基于MCP协议的AI驱动API测试:原理、架构与工程实践

1. 项目概述&#xff1a;API测试的“瑞士军刀”MCP最近在梳理团队内部的API测试流程时&#xff0c;发现了一个挺有意思的项目&#xff1a;cocaxcode/api-testing-mcp。乍一看这个标题&#xff0c;可能很多朋友会有点懵&#xff0c;这“MCP”是个啥&#xff1f;其实&#xff0c;…...

ArchR实战避坑指南:从scATAC-seq数据到细胞轨迹分析,我的踩坑记录与参数调优心得

ArchR实战避坑指南&#xff1a;从scATAC-seq数据到细胞轨迹分析 当你在深夜第三次尝试用ArchR处理scATAC-seq数据时&#xff0c;突然弹出的红色报错信息是否让你感到绝望&#xff1f;作为一款强大的单细胞染色质可及性分析工具&#xff0c;ArchR的官方教程虽然详尽&#xff0c;…...

OpenClaw用户如何通过Taotoken获得更优的模型调用体验

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 OpenClaw用户如何通过Taotoken获得更优的模型调用体验 对于使用OpenClaw构建智能体工作流的开发者而言&#xff0c;直接对接多个大…...

Habitat-Lab具身AI仿真平台:从核心概念到实战部署全解析

1. 项目概述&#xff1a;从零开始理解Habitat-Lab 如果你正在研究具身智能&#xff0c;或者对如何让AI在三维物理世界里“学会做事”感到好奇&#xff0c;那你大概率已经听说过Habitat-Lab这个名字。它不是一个游戏引擎&#xff0c;也不是一个单纯的机器人仿真器&#xff0c;而…...