Java 反射:框架设计的灵魂

NVMe与PCIe的完美结合:高速存储背后的技术解析 本文深入解析了NVMe与PCIe技术如何完美结合,实现高速存储性能的飞跃。从机械硬盘到NVMe SSD的进化历程出发,详细介绍了PCIe总线的高带宽优势与NVMe协议的低延迟设计,以及两者协同工作带来的显著性能提升。通过实测数据对比,展示了NVMe SSD在消费级和企业级应用中的卓越表现,并提供了选购与优化建议。 阅读详情

在学习 Java 反射之前,先让我们看看这几个概念。

 

 

01

 

解释型语言和编译型语言

 

 

解释型语言:不需要编译,在运行的时候逐行翻译解释;修改代码时可以直接修改,可以快速部署,不过性能上会比编译型语言稍差;比如 JavaScript、Python ;

 

编译型语言:需要通过编译器将源代码编译成机器码才能执行;编译之后如果需要修改代码,在执行之前就需要重新编译。比如 C 语言;

 

Java 严格来说也是编译型语言,但又介于编译型和解释型之间;Java 不直接生成机器码而是生成中间码:编译期间,是将源码交给编译器生成 class 文件(字节码),这个过程中只做了翻译的工作,并没有把代码放入内存运行;当进入运行期,字节码才被 Java 虚拟机加载、解释成机器语言并运行。

 

 

 

02

 

动态语言和静态语言

 

 

动态语言:是指程序在运行时可以改变自身结构,在运行时确定数据类型,一个对象是否能执行某操作,只取决于它有没有对应的方法,而不在乎它是否是某种类型的对象;比如 JavaScript、Python。

 

静态语言:相对于动态语言来说,在编译时变量的数据类型就已经确定(使用变量之前必须声明数据类型),在编译时就会进行类型是否匹配;比如 C 语言、Java ;

 

 

03

 

反射的概念

 

 

Java 反射机制:在运行过程中,对于任意一个类,都能知道其所有的属性和方法;对于任意一个对象,都能调用其属性和方法;这种动态获取类信息和调用对象方法的功能,就是 Java 反射机制。

 

既然反射里面有一个“反”字,那么我们先看看何为“正”。

 

在 Java 中,要使用一个类中的某个方法,“正向”都是这样的:

 

  •  
  •  
ArrayList list = new ArrayList(); //实例化list.add("reflection");  //执行方法

 

那么反向(反射)要如何实现?

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
Class clz = Class.forName("java.util.ArrayList");Method method_add = clz.getMethod("add",Object.class);Constructor constructor = clz.getConstructor();Object object = constructor.newInstance();method_add.invoke(object, "reflection");
Method method_get = clz.getMethod("get",int.class);System.out.println(method_get.invoke(object, 0));

 

两段代码执行的结果是一样的,但是“正向”代码在编译前,就已经明确了要运行的类是什么(ArrayList),而第二段代码,只有在代码运行时,才知道运行的类是 java.util.ArrayList。

 

 

04

 

反射的作用

 

 

讲到这里,有些同学可能会有疑问:“反射有什么用?我明明都已经知道了要使用的类是 ArrayList ,我不能直接 new 一个对象然后执行里面的方法么?”

 

当然可以!不过很多场景中,在代码运行之前并不知道需要使用哪个类,或者说在运行的时候才决定使用哪个类;

 

比如有这么一个功能:“调用阿里云的人脸识别 API ”;这还不简单,参考对方的 API 文档,很快就能实现。

 

 

 

  •  
  •  
  •  
faceRecognition(Object faceImg){  //调用阿里云的人脸识别 API}

 

上线一个月后,领导说:“咱公司开始和腾讯云合作了,人脸识别的接口改一下吧”。

 

 

 

  •  
  •  
  •  
faceRecognition(Object faceImg){  //调用腾讯云的人脸识别 API}

 

修改上线运行了两个月,领导说:“换回来吧”...  ...

 

当然有聪明的程序员会想到设置一个开关配置,让开关决定走哪段代码逻辑,如果领导哪天想变成亚马逊云的服务,继续写 if-else 就好了:

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
faceRecognition(Object faceImg){  if("AL".equals(configStr)){    //调用阿里云的人脸识别 API  }else if("TX".equals(configStr)){    //调用腾讯云的人脸识别 API  }else if("AM".equals(configStr)){    //调用亚马逊云的人脸识别 API  }}

 

不过还有一种更好的方法:

 

1. 定义一个接口:

 

  •  
  •  
  •  
interface FaceRecognitionInterface(){  faceRecognition(Object faceImg) ;}

 

2. 多个实现类:

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
class ALFaceRecognition implements FaceRecognitionInterface{  //调用阿里云的人脸识别 API 的实现}
class TXFaceRecognition implements FaceRecognitionInterface{  //调用腾讯云的人脸识别 API 的实现}

 

3. 在调用人脸识别功能的代码中:

 

  •  
  •  
  •  
String configStr = "读取配置,走阿里云还是腾讯云";FaceRecognitionInterface faceRe =  Class.forName(configStr).newInstance();faceRe.faceRecognition(faceImg);

 

如果上面这个例子,你依然觉得在调用方法中做 if-else 判断,和使用反射实现并没有差太多,但是如果程序员 A 提供接口,程序员 B 提供实现,程序员 C 写客户端呢?

 

回忆一下 JDBC 的使用,比如创建一个连接:

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
public Connection getConnection() throws Exception{  Connection conn = null;  //初始化驱动类  Class.forName("com.mysql.jdbc.Driver");  conn = DriverManager.getConnection("jdbc:mysql://url","root", "admin");  return conn;}

 

其中:

 

  • 程序员 A 提供接口:Oracle 公司(之前的 Sun)提供 JDBC 标准(接口)。

  • 程序员 B 提供实现:各个数据库厂商提供针对自家数据库的实现。

  • 程序员 C 写客户端:我等码农在 Java 中敲代码访问数据库。

 

总结一下Java 反射的作用:可以设计出更为通用和灵活的架构,很多框架为了保证其通用性,可以根据配置加载不用的类,这时候要用到反射。除此之外:

 

  • 动态代理:在不改变目标对象方法的情况下对方法进行增强,比如使用 AOP 拦截某些方法打印日志,这就需要通过反射执行方法中的内容。

  • 注解:利用反射机制,获取注解并执行对应的行为。

 

 

05

 

用反射的用法

 

 

上文中我们知道了 Java 运行期的源文件是 class 文件(字节码),所以要使用反射,那么就需要获取到字节码文件对象,在 Java 中,获取字节码文件对象有三种方式:

 

  • 调用某个类的 class 属性:类名.class

  • 调用对象的 getClass() 方法:对象.getClass()

  • 使用 Class 类中的 forName() 静态方法:Class.forName(类的全路径) ,建议使用这种方法

 

java.lang.reflect 类库提供了对反射的支持:

 

  • Field :可以使用 get 和 set 方法读取和修改对象的属性;

  • Method :可以使用 invoke() 方法调用对象中的方法;

  • Constructor :可以用 newInstance() 创建新的对象。

 

 

06

 

反射的优缺点

 

 

优点:在运行时动态获取类和对象中的内容,极大地提高系统的灵活性和扩展性;夸张一些说,反射是框架设计的灵魂。

 

缺点:会有一定的性能损耗,JVM 无法对这些代码进行优化;破坏类的封装性。

 

总之,可能大家在平时的开发过程中,感觉自己并没有写过反射相关的代码,但是在我们用到的各种开源框架中,反射无处不在。

嵌入式面试|MCU+RTOS技术栈——面试八股文整理3:STM32 stm32 阅读详情

相关推荐

告别单调!3种方法给VS2019换上VSCode同款NightOwl主题(附字体优化技巧)

本文详细介绍了三种将VSCode热门NightOwl主题移植到VS2019的方法,包括扩展市场直装、官方主题库导入与增强以及手动调色实现像素级复刻。同时提供了字体优化与视觉增强技巧,帮助开发者打造更舒适的编码环境。

weixin_28836989的博客 214

Java--反射(框架设计的灵魂)案例

Java--反射(框架设计的灵魂)案例 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 需求 写一个"框架",不能改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法 使用 配置文件 反射 步骤 将需要创建的对象的全类名和需要执行的方法定义在配置文件中 在程序中加载读取配置文件 使用反射技术来加载类文件进内存 创建对象 执行方法 配置文件 className=Student me

归子莫的博客 1096

8位可控加减法电路设计

一、设计要求   利用Logisim平台中现有运算部件构建一个8位可控加减法器,可支持八位加减法,利用已经封装全加器和逻辑门进行连接,要求实现相应的输出,判断是否溢出。 二、方案设计 实验原理: [A]补+[B]补 = [A+B]补(mod2^n+1)   公式1        [A-B]补 = [A]补+[-B]补(mod2^n+1)    公式2 FA为全加器,利用全加器实现加减法,难点在于实验减法,对输入的[Y]补各位取反加一即为[-Y]补,利用公式2,就可以将减法转化为加法再利用全加

qq_51700383的博客 1万+

Java--反射(框架设计的灵魂)

Java--反射(框架设计的灵魂) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 框架:半成品软件。可以在框架的基础上进行软件开发,简化编码 反射:将类的各个组成部分封装为其他对象,这就是反射机制 反射机制的好处 可以在程序运行过程中,操作这些对象 可以解耦,提高程序的可扩展性 获取Class对象的方式 Class.forName("全类名"):将字节码文件加载进内存,返回Class对象 多用于

归子莫的博客 986

软件工程案例教程·韩万江【课后习题】

!!!!

weixin_57858263的博客 6421

三维重建之条纹投影结构光(一)

该系列为条纹投影结构光学习笔记,一共分为四篇。第一篇记录文献阅读的笔记,对重要知识点进行摘录介绍。 本篇以理论知识推导为主,主要从以下三个方面进行介绍,首先介绍条纹投影的三角测量原理;然后介绍相位主值的求解和相位展开;最后介绍相位和高度的模型,即相高模型。本篇博文不涉及具体的代码实现。 条纹投影结构光测量原理 ...

beyond951的博客 3万+

Java——反射:框架设计的灵魂

在说反射之前不得不先提一个东西,框架,框架可以干什么,不妨举个例子来看。 举个最简单的例子,我们假如要创建某一类的对象,执行其中的一个方法,我们可以怎么做?按照平常的方法自然是: Person p = new Person(); p.doSomething(); 这种方法固然简单,但是在面对今后编写更加复杂的代码时,若要进行更改则会出现牵一发而动全身的效果,需要重新进行复杂的测试,为此,框架应运而生。而反射就是框架设计的灵魂。 反射 反射:将类的各个组成部分封装为其他对象,这就是反射机制 好处: 可

Tomas_yue的博客 269

opencv基础57-模板匹配cv2.matchTemplate()->(目标检测、图像识别、特征提取)

OpenCV 提供了模板匹配(Template Matching)的功能,它允许你在图像中寻找特定模板(小图像)在目标图像中的匹配位置。模板匹配在计算机视觉中用于目标检测、图像识别、特征提取等领域。: 首先,加载目标图像和要匹配的模板图像。: 选择适当的匹配方法,例如 cv2.TM_CCOEFF、cv2.TM_CCOEFF_NORMED、cv2.TM_CCORR、cv2.TM_CCORR_NORMED、cv2.TM_SQDIFF 或 cv2.TM_SQDIFF_NORMED。每种方法对应不同的匹配计算方式。

小海聊智造 1万+

Java反射:框架设计的灵魂

Java反射:框架设计的灵魂 框架:办成品软件,可以在框架的基础上进行开发 反射:将类的各个部分封装成对象,这就是反射机制 反射的好处 在程序运行的过程中,操作这些对象 可以降低程序的耦合性,提高程序的可扩展性 获取class对象的方式 Class.forName(“全类名”):经字节码文件加载进内存,返回class对象 多用于配置文件,将类名定义在配置文件中,读取文件,加载类 ...

紫芝的博客 532

FFmpeg + OBS 低延迟直播串流实战:从H264裸流到RTP组播的完整配置

本文详细介绍了如何利用FFmpeg将H264裸流转码为RTP协议,并通过组播技术实现与OBS客户端的超低延迟直播串流。文章深入剖析了FFmpeg关键参数调优、SDP文件生成与配置,以及OBS客户端的无缝拉流方法,为需要毫秒级实时交互的场景提供了一套去中心化、高效稳定的完整解决方案。

fanta的博客 830

【华为OD机试真题】45、 分糖果 | 机试真题+思路参考+代码解析(C++、Java、Py、JS)

### 🎃题目描述 >小明从糖果盒中随意抓一把糖果,每次小明会取出一半的糖果分给同学们。 >  当糖果不能平均分配时,小明可以选择从糖果盒中(假设盒中糖果足够)取出一个糖果或放回一个糖果。 >  小明最少需要多少次(取出、放回和平均分配均记一次),能将手中糖果分至只剩一颗。

正在更新最新华为OD机试2025B卷,提供OJ在线刷题 1290

Java反射:框架设计的灵魂,关于Java反射的思考

什么是反射 说起框架,相信很多人都用过,如今的开发基本离不开框架,从spring,strtus等到如今的spring boot,框架已经深入到了开发的点点滴滴,相信很多人在使用spring框架时都是这样使用的,在xml文件中配置相应的Java类和方法等,这样的话使用注解就不需要自己的new一个对象了,spring框架已经帮我们处理好了,这就是反射。 反射就是运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对..

AI菜鸡,NLP领域,至今为发不出论文掉头发 260

Debezium系列之:深入理解 Debezium Topic的设置要求

Debezium系列之:配置 Debezium Topic

zhengzaifeidelushang的博客 1009

Java中的反射:框架设计的灵魂

反射:框架设计的灵魂 框架:半成品软件。可以在框架的基础上进行软件开发,简化编码 反射:将类的各个组成部分封装为其他对象,这就是反射机制 好处: 可以在程序运行过程中,操作这些对象。 可以解耦,提高程序的可扩展性。 获取Class对象的方式: Class.forName(“全类名”):将字节码文件加载进内存,返回Class对象 多用于配置文件,将类名定义在配置文件中。读取文件,加载类 类名....

liuzuoping的博客 832

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: 请不要再说Java中final方法比非final性能更好了
下一篇: Java是未来的第一编程语言吗?
Java奥利给
博客等级 码龄6年 150粉丝 154原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值