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

libcrypto.so.10(OPENSSL_1.0.2)(64bit) is needed by erlang-22.0.7-1.el7.x86_64 今天安装Rabbitmq的 erlang-22.0.7-1.el7.x86_64.rpmrpm包时遇到了这个坑,害找到说是不容易;错误信息在下面; [root@iz2zef7u84js1qeeq00ewwz RabbitMQ]# rpm -ivh erlang-22.0.7-1.el7.x86_64.rpm warning: erlang-22.0.7-1.el7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID 6026dfca: NOKEY error: 阅读详情

在说反射之前不得不先提一个东西,框架,框架可以干什么,不妨举个例子来看。
举个最简单的例子,我们假如要创建某一类的对象,执行其中的一个方法,我们可以怎么做?按照平常的方法自然是:

Person p = new Person();
p.doSomething();

这种方法固然简单,但是在面对今后编写更加复杂的代码时,若要进行更改则会出现牵一发而动全身的效果,需要重新进行复杂的测试,为此,框架应运而生。而反射就是框架设计的灵魂。

反射

反射:将类的各个组成部分封装为其他对象,这就是反射机制

  • 好处:

    • 可以在程序运行过程中,操作这些对象。
    • 可以解耦,提高程序的可扩展性。
  • 获取Class对象的方式:

    • Class.forName(“全类名”):将字节码文件加载进内存,返回Class对象
      • 当出现ClassNotFoundException是就说明有可能是forName()中的全类名写错了
      • 多用于配置文件,将类名定义在配置文件中。读取文件,加载类
    • 类名.class:通过类名的属性class获取
      • 多用于参数的传递
    • 对象.getClass():getClass()方法在Object类中定义着。
      • 多用于对象的获取字节码的方式
  • Class对象功能:

    • 获取功能:
      • 获取成员变量

        • Field[] getFields() :获取所有public修饰的成员变量

        • Field getField(String name) 获取指定名称的 public修饰的成员变量

        • Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符

        • Field getDeclaredField(String name)

      • 获取构造方法

        • Constructor<?>[] getConstructors()

        • Constructor getConstructor(类<?>… parameterTypes)

        • Constructor getDeclaredConstructor(类<?>… parameterTypes)

        • Constructor<?>[] getDeclaredConstructors()

      • 获取成员方法:

        • Method[] getMethods()

        • Method getMethod(String name, 类<?>… parameterTypes)

        • Method[] getDeclaredMethods()

        • Method getDeclaredMethod(String name, 类<?>… parameterTypes)

      • 获取全类名

        • String getName()
  • Field:成员变量

    • 操作:
      • 设置值

        • void set(Object obj, Object value)
      • 获取值

        • get(Object obj)
      • 忽略访问权限修饰符的安全检查

        • setAccessible(true):暴力反射
  • Constructor:构造方法

    • 创建对象:
      • T newInstance(Object… initargs)

      • 如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法

  • Method:方法对象

    • 执行方法:

      • Object invoke(Object obj, Object… args)
    • 获取方法名称:

      • String getName:获取方法名

了解了反射之后,我们可以尝试写一个简单的框架来实现不改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法

如果要实现这个框架我们需要两点

  1. 配置文件
  2. 反射
//1.加载配置文件
        //1.1创建Properties对象
        Properties pro = new Properties();
        //1.2加载配置文件,转换为一个集合
        //1.2.1获取class目录下的配置文件
        ClassLoader classLoader = ReflectTest.class.getClassLoader();
        InputStream is = classLoader.getResourceAsStream("pro.properties");
        pro.load(is);

        //2.获取配置文件中定义的数据
        String className = pro.getProperty("className");
        String methodName = pro.getProperty("methodName");


        //3.加载该类进内存
        Class cls = Class.forName(className);
        //4.创建对象
        Object obj = cls.newInstance();
        //5.获取方法对象
        Method method = cls.getMethod(methodName);
        //6.执行方法
        method.invoke(obj);

步骤:

1. 将需要创建的对象的全类名和需要执行的方法定义在配置文件中
2.在程序中加载读取配置文件
3. 使用反射技术来加载类文件进内存
4. 创建对象
5. 执行方法

通过这个简单的框架只需要更改如下图所示的配置文件,就可以实现不改变该类的任何代码的前提下,可以帮我们创建任意类的对象,并且执行其中任意方法的目标。
在这里插入图片描述

以上就是反射的基本介绍和应用,希望可以为您提供帮助。

【服务器电源架构与关键技术发展趋势】AI数据中心迅猛发展,服务器电源如何演变? 功率级跃升:机柜功率从 100kW 向 1MW 级发展,供电架构采用 HVDC + 固态变压器(SST),省去传统 UPS、PFC 环节; 母线电压升级:从 48V 向 400V→800V 演进,配套 AI 电弧检测、智能运维解决高压安全与维护难题; 能效(PUE)提升:目标 PUE<1.3,通过液冷 CDU 替代传统风冷,可将 PUE 降至 1.16(传统 AI 集群 PUE 达 1.6); 拓扑控制复杂化:功率拓扑从单相→三相、单级→多交错结构,适配高功率需求; 安全维度扩展:新增网络安全防护需求。 阅读详情

相关推荐

图像修复黑科技:对比BM3D/DnCNN等5种去噪器在PNP框架中的实战效果

本文深度评测了BM3D、DnCNN等五款主流去噪器在即插即用(PnP)优化框架中的实战表现。通过量化指标、视觉对比及超分等泛化任务测试,揭示了深度学习模型在性能与收敛速度上的优势,并为不同应用场景提供了选型指南与工程化建议。

weixin_29065959的博客 369

反射:框架设计的灵魂

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

qq_22189479的博客 246

Ollama本地大模型部署指南:从核心原理到实战避坑

大语言模型(LLM)作为人工智能领域的核心技术,通过海量数据训练获得强大的语言理解和生成能力。其工作原理基于Transformer架构,通过自注意力机制处理序列数据,在文本生成、代码编写和对话系统等场景展现出巨大价值。随着开源模型的普及,本地部署成为关注焦点,它解决了数据隐私和定制化需求,但面临环境配置和资源管理的挑战。Ollama作为开源工具,通过封装模型格式和统一API,简化了本地部署流程,支持GPU加速和性能调优,让开发者能够快速集成到IDE和自动化脚本中,实现高效的本地AI应用部署。

weixin_30915951的博客 452

Java反射:框架设计的灵魂

框架:半成品软件。可以在框架的基础上进行软件开发,简化编码。 反射就是把Java类中的各个成员映射成一个个的Java对象。 即在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能调用它的任意一个方法和属性。 这种动态获取信息及动态调用对象方法的功能叫Java的反射机制。 好处: 1. 可以在程序运行过程中,操作这些对象。 1. 可以解耦,提高程序的可扩展性。

write less , do more 5114

Argoverse轨迹预测实战:从数据加载到地图API应用全解析

本文详细解析了Argoverse数据集在轨迹预测中的应用,从数据加载到地图API的实战技巧全涵盖。通过具体代码示例展示如何高效处理轨迹数据、实现可视化及基础预测模型,帮助开发者快速掌握自动驾驶轨迹预测的核心技术。特别介绍了Argoverse地图API的深度应用和性能优化经验。

weixin_29182481的博客 241

Go-zero微服务实战:从零搭建电商用户系统(含完整代码示例)

本文详细介绍了如何使用go-zero框架从零搭建电商用户系统,包含完整的微服务架构设计、核心功能实现代码示例以及性能优化策略。通过分层架构设计、JWT认证、分布式锁等关键技术,实现高并发、高可用的用户系统,适用于电商平台开发。

weixin_29275257的博客 256

什么是反射: 框架设计的灵魂

框架:半成品的软件,可以在框架的基础上进行软件开发,简化编码 反射:将类的各个组成部分封装为其他对象,这就是反射机制 好处: 1、可以在程序运行过程中,操作这些对象 2、可以解耦,提高程序的可扩展性 Java代码在计算机中经历的阶段:三个阶段 获取方式 1、class.forname(“全类名”); 2、类名.class; 3、对象名.getClass(); public class ReflectDemo1 { public static void main(String[] ar.

地下农民 400

【立创开源】太阳能板充电方案单节3.7v锂电池充电

一直对太阳能板感兴趣,老是感觉充电好麻烦,要是放在那里就可以自己充电多好,所以尝试做了一个太阳能充电板。因为这几天都是阴天,所以测试效果不太好,但是下雨天也是能充电的,但是基本只能维持电量不掉,电压差不多4.2v以上,电流只有2mA。中午出太阳的时候,隔着玻璃放在太阳下测试,电流有12mA以上。能充起一点点电。等大晴天看一看能不能达到卖家说50mA。┗( T﹏T )┛感觉达不到。这个东西只能当一个玩具(;′⌒`)。不过如果汽车上一些行车记录仪加一个这个,汽车经常在太阳下停车,可能再也不用充电了。

贾saisai的博客 1万+

【十六】Java反射思维导图

知识章节参考:【十六】Java反射

奈何的人生 1129

【自动驾驶学习笔记——Prescan和Simulink 学习笔记和问题记录(1)】

主要记录一些Prescan/Simulink 联合仿真出现的问题。

ly1336545868的博客 1465

[原创]Keil工程STM32F103C8T6无缝转换到STM32F103RCT6

有个项目,老版本是STM32F103C8T6,硬件资源不够了,新版本采用STM32F103RCT6。 无缝过渡,如下: 选定芯片 宏定义改为STM32F10X_HD,USE_STDPERIPH_DRIVER 删除原有的启动汇编文件,更换为高密度器件汇编文件 时钟系统紊乱? 那得看你程序怎么写: 先看F103时钟树 int main(void) { unsigned char stat...

江东风又起 2万+

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

java反射概念: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 获取Class类的实例对象的三种方式 在面向对象的世界里,万事万物皆对象。(java语言中,静态的成员、普通数据类型除外) 类是不是对象呢?类是(哪个类的对象呢?)谁...

你学废了吗? 1769

第32篇:Vibe Coding时代:LangGraph + Redis 任务状态持久化实战,解决服务重启后任务状态丢失问题

LangGraph + Redis任务状态持久化方案 本文针对Agent任务状态丢失问题,提出基于Redis的持久化解决方案。当服务重启时,传统内存存储方式会导致任务状态丢失,影响用户体验和运维排查。 核心方案 使用Redis Hash存储任务状态,key格式为agent:task:{task_id} 设计完整状态字段包括task_id、status、progress等关键信息 实现task_store模块提供CRUD操作接口 在Agent执行各节点更新Redis中的任务状态 技术实现 通过Celery执行

sundong_81的博客 42

Java 反射:框架设计的灵魂

在学习 Java 反射之前,先让我们看看这几个概念。 1、解释型语言和编译型语言 解释型语言:不需要编译,在运行的时候逐行翻译解释;修改代码时可以直接修改,可以快速部署,不过性能上会比编译型语言稍差;比如 JavaScript、Python ; 编译型语言:需要通过编译器将源代码编译成机器码才能执行;编译之后如果需要修改代码,在执行之前就需要重新编译。比如 C 语言; Java 严格来说也...

游戏建模零基础入门教程 1703

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

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

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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

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

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

liuzuoping的博客 832

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: Java——junit单元测试基础
下一篇: Java——注解的概念及应用
夏洛XIALUO
博客等级 码龄8年 897粉丝 49原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值