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

java反射机制及其详解

反射

    • 反射机制
    • 反射调用优化


有时候我们做项目的时候不免需要用到大量配置文件,就拿框架举例,通过这些外部文件配置,在不修改的源码的情况下,来控制文件,就要用到我们的反射来解决

假设有一个Cat对象

public class Cat {private String name = "招财猫";public void hi(){System.out.println("hi "+name);}
}

传统调用方法

public class ReflectionQuestion {public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {//传统的方式 new 对象 -》 调用方法Cat cat = new Cat();cat.hi();}
}

现在有一个配置文件

classfullpath=Reflection.com.hspedu.Cat
method=hi

反射调用

/反射问题的引入
public class ReflectionQuestion { 
//1.使用Properties类,可以读写配置文件Properties properties = new Properties();properties.load(new FileInputStream("src\\Reflection\\re.properties"));String classfullpath = properties.get("classfullpath").toString();String method = properties.get("method").toString();//使用反射机制来解决//(1)加载类,返回Class类型的对象Class cls = Class.forName(classfullpath);//(2)通过 cls 得到你加载的类 com.hspedu.CatObject o = cls.newInstance();System.out.println("o的运行类型="+o.getClass());//(3)通过 cls 得到你加载的类 Reflection.com.hspedu.Cat 的 methodName 的方法对象//即: 在反射中,可以把方法视为对象(万物皆对象)Method method1 = cls.getMethod(method);//(4)通过method1 调用方法:即通过方法对象实现调用方法System.out.println("=========================");method1.invoke(o);}
}

运行结果:
在这里插入图片描述
反射的强大之处就是可以在外部文件上不修改源码的情况下来控制程序


反射机制

反射机制允许程序在执行的时候借助我们Reflection API取得任何类的内部信息,并且能操作对象的属性及方法。反射在设计模式和框架底层都会用到
(一个类只有一个Class对象),这个对象包含了类的完整结构信息。通过这个对象得到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,形象的称之为:反射
解释

//反射问题的引入
public class ReflectionQuestion {public static void main(String[] args) throws IOException, ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {//1.使用Properties类,可以读写配置文件Properties properties = new Properties();properties.load(new FileInputStream("src\\Reflection\\re.properties"));String classfullpath = properties.get("classfullpath").toString();String method = properties.get("method").toString();//使用反射机制来解决//(1)加载类,返回Class类型的对象Class cls = Class.forName(classfullpath);Class cls2 = Class.forName(classfullpath);System.out.println(cls.hashCode());System.out.println(cls2.hashCode());}
}

运行结果:
在这里插入图片描述
可以看出来他们指向同一个对象
在这里插入图片描述
java反射机制可以完成

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


反射调用优化

优点:可以动态的创建和使用对象(也是框架底层核心),使用灵活,没有反射机制,框架技术就会失去底层支持
缺点:使用反射基本是解释执行,对执行速度有影响

public class Reflection02 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {m1();m2();}//传统方式来调用hipublic static void m1(){Cat cat = new Cat();long start = System.currentTimeMillis();for(int i=0;i<90000000;i++){cat.hi();}long end = System.currentTimeMillis();System.out.println("传统方法来调用hi 耗时="+(end-start));}//反射机制调用方法hipublic static void m2() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {Class cls = Class.forName("Reflection.com.hspedu.Cat");Object o = cls.newInstance();Method hi = cls.getMethod("hi");long start = System.currentTimeMillis();for(int i=0;i<90000000;i++){hi.invoke(o);}long end = System.currentTimeMillis();System.out.println("反射方法来调用hi 耗时="+(end-start));}
}

运行结果:
在这里插入图片描述
差距这么大有什么方法优化吗

//反射调用优化 + 关闭访问检查public static void m3() throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {Class cls = Class.forName("Reflection.com.hspedu.Cat");Object o = cls.newInstance();Method hi = cls.getMethod("hi");hi.setAccessible(true);long start = System.currentTimeMillis();for(int i=0;i<90000000;i++){hi.invoke(o);}long end = System.currentTimeMillis();System.out.println("反射方法来调用hi 耗时="+(end-start));}

在这里插入图片描述

相关文章:

java反射机制及其详解

反射反射机制反射调用优化有时候我们做项目的时候不免需要用到大量配置文件&#xff0c;就拿框架举例&#xff0c;通过这些外部文件配置&#xff0c;在不修改的源码的情况下&#xff0c;来控制文件&#xff0c;就要用到我们的反射来解决 假设有一个Cat对象 public class Cat …...

Leetcode—环形链表

前言&#xff1a;给定一个链表&#xff0c;判断是否为循环链表并找环形链表的入口点 首先我们需要知道什么是双向循环链表&#xff0c;具体如下图所示。 对于链表&#xff0c;我们如何去判断链表是循环链表呢&#xff1f;又寻找入环点呢&#xff1f;我们可以利用快慢指针的方法…...

蓝牙耳机哪个戴的最舒服?久戴不累的蓝牙耳机推荐

在喧嚣的时代中&#xff0c;快节奏和疲惫充斥着我们的生活&#xff0c;于是耳机成为了人们必不可少的东西&#xff0c;无论是闲暇时亦或是正处在工作时&#xff0c;都会将它戴上&#xff0c;出门在外戴耳机变成了常态&#xff0c;所以小编就整理了一期久戴不累的蓝牙耳机。 No…...

25k的Java开发常问的AQS问题有哪些?

前言:面试高频的AQS问题大多。本文将以实战面试角度出发,将面试官喜欢问的一些问题罗列出来。 文章目录 AQSAQS定义底层实现独占锁举例底层实现独占锁超时获取锁共享锁举例共享锁实现原理作者辟谣AQS AQS定义 AQS的全称是AbstractQueuedSynchronizer,也就是抽象队列同步器…...

Grafana 监控面板绘制流程

本篇作者&#xff1a;IoTDB 社区 -- 张洪胤本文以 IoTDB V1.0.1 版本为例本文档介绍了 Apache IoTDB 监控指标通过 Prometheus 的方式进行采集&#xff0c;并且使用 Grafana 的方式进行可视化。1监控指标的 Prometheus 格式说明对于 Metric Name 为 name, Tags 为 K1V1, ..., K…...

一句话设计模式5:责任链模式

责任链模式:步步为营。 文章目录 责任链模式:步步为营。前言一、责任链模式的作用二、如何实现责任链1 既然是责任链,那么就需要一个链路的承载体 ChainBody2 责任链中每一步都是一个抽象类,因为承载体仅仅是构造链路顺序,里面不放置任何具体业务逻辑:步骤抽象类3 具体步骤执行…...

保姆级使用PyTorch训练与评估自己的EVA网络教程

文章目录前言0. 环境搭建&快速开始1. 数据集制作1.1 标签文件制作1.2 数据集划分1.3 数据集信息文件制作2. 修改参数文件3. 训练4. 评估5. 其他教程前言 项目地址&#xff1a;https://github.com/Fafa-DL/Awesome-Backbones 操作教程&#xff1a;https://www.bilibili.co…...

Java--JMH--性能测试--测试软件运行效率/时间--StopWatch

写在前面: 很多时候想要测试代码运行时间&#xff0c;或者比较2个运行的效率。 最简单的方法就是Sytem.currentTimeMillis记录2开始和结束时间来算 但是Java 代码越执行越快&#xff0c;放在后面的方法会有优势&#xff0c;这个原因受留个眼&#xff0c;以后研究。大概有受类加…...

JavaScript Array(数组)对象

数组对象的作用是&#xff1a;使用单独的变量名来存储一系列的值。参数参数 size 是期望的数组元素个数。返回的数组&#xff0c;length 字段将被设为 size 的值。参数 element ...; elementn 是参数列表。当使用这些参数来调用构造函数 Array() 时&#xff0c;新创建的数组的元…...

干货 | 电容在电路35个基本常识

第1个电压源正负端接了一个电容&#xff0c;与电路并联&#xff0c;用于整流电路时&#xff0c;具有很好的滤波作用&#xff0c;当电压交变时&#xff0c;由于电容的充电作用&#xff0c;两端的电压不能突变&#xff0c;就保证了电压的平稳。当用于电池电源时&#xff0c;具有交…...

日读300篇文献的技巧

感觉自己看文章很慢&#xff0c;有时候也抓不住重点。 如果是英文文献的话&#xff0c;可能还要有点难度&#xff0c;毕竟英语渣渣还是需要有中文-》英文的转换过程。 最近在搞毕业论文的时候&#xff0c;发现了一个非常好玩的东西&#xff0c;大大提升了我看文章搞科研&#x…...

C++核心编程

一、内存分区模型概述&#xff1a;C程序在执行时&#xff0c;将内存划分为4个区域程序运行前&#xff1a;代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操作系统管理①共享。共享的目的是对于频繁被执行的程序&#xff0c;在内存中只需有一份代码即可②只读。使其只…...

SpringMVC程序开发

目录 SpringMVC 1、MVC定义 2、MVC和SpringMVC之间的关系 学SpringMVC 1、Spring MVC的创建和连接 浏览器获取前端接口和后端程序连接功能实现 2、获取参数 2.1、传递单个参数/多个参数 2.2、传递对象 2.3、传递表单参数 2.4、后端参数重命名 2.5、RequestBody接收J…...

多版本并发控制MVCC

什么是MVCC&#xff1f; MVCC是一种并发控制方法&#xff0c;一般在数据库管理系统中&#xff0c;实现数据库的并发访问。 可以使用乐观锁和悲观锁来实现。 MVCC的作用&#xff1f; 可以在不加锁的情况下解决读写问题&#xff0c;同时还可以解决脏读&#xff0c;幻读&#…...

JavaScript Date(日期)对象

日期对象用于处理日期和时间。在线实例返回当日的日期和时间如何使用 Date() 方法获得当日的日期。getFullYear()使用 getFullYear() 获取年份。getTime()getTime() 返回从 1970 年 1 月 1 日至今的毫秒数。setFullYear()如何使用 setFullYear() 设置具体的日期。toUTCString()…...

【Python】AES加解密代码,文章还有加密串等你来解密,等你来挑战

&#x1f366;&#x1f366;写这篇AES文章也是有件趣事&#xff0c;有位小伙伴发了段密文&#xff0c;看看谁解密速度快&#xff0c;学过Python的小伙伴一下子就解开来了&#xff0c;内容也挺有趣的。 &#x1f35f;&#x1f35f;原来加解密也可以这么有趣&#xff0c;虽然看起…...

代码随想录【Day34】| 1005. K 次取反后最大化的数组和、134. 加油站、135. 分发糖果

1005. K 次取反后最大化的数组和 题目链接 题目描述&#xff1a; 给定一个整数数组 A&#xff0c;我们只能用以下方法修改该数组&#xff1a;我们选择某个索引 i 并将 A[i] 替换为 -A[i]&#xff0c;然后总共重复这个过程 K 次。&#xff08;我们可以多次选择同一个索引 i。&…...

Java性能调优杀手锏JMH

JMH简介 JMH(Java Microbenchmark Harness)由 OpenJDK/Oracle 里面那群开发了 Java编译器的大牛们所开发&#xff0c;是一个功能强大、灵活的工具&#xff0c;它可以用于检测和评估Java应用程序的性能&#xff0c;主要目的是测量Java应用程序的性能&#xff0c;尤其是在多线程…...

实现excle表上传生成echarts图

代码如下html <!--这是一个网上关于读取Excel最经典的代码--> <!DOCTYPE html> <html><head><meta charset"utf-8"><title>ECharts</title><!-- 引入 echarts.js --><!-- <script src"newjs/js/incubato…...

python代码如何打包

网上的文章对小白都不太友好呀&#xff0c;讲得都比较高大上&#xff0c;本文章就用最简单的方式来教会大家如何打包。既然各位已经学习到了python打包了&#xff0c; 深适度应该跟我查不多。 注意事项&#xff1a; 1. 这个插件只能打包 mac 、win系统运行的文件&#xff0c;也…...

3步实战UE4SS游戏Mod开发:从零构建你的第一个LUA脚本系统

3步实战UE4SS游戏Mod开发&#xff1a;从零构建你的第一个LUA脚本系统 【免费下载链接】RE-UE4SS Injectable LUA scripting system, SDK generator, live property editor and other dumping utilities for UE4/5 games 项目地址: https://gitcode.com/gh_mirrors/re/RE-UE4S…...

ESP32音频播放终极指南:从SD卡播放MP3到网络流媒体的完整解决方案

ESP32音频播放终极指南&#xff1a;从SD卡播放MP3到网络流媒体的完整解决方案 【免费下载链接】ESP32-audioI2S Play mp3 files from SD via I2S 项目地址: https://gitcode.com/gh_mirrors/es/ESP32-audioI2S 想要在ESP32上构建专业的音频播放系统吗&#xff1f;ESP32-…...

告别底噪与失真:手把手教你用STM32 I2C驱动WM8988音频Codec(附完整寄存器配置代码)

嵌入式音频开发实战&#xff1a;WM8988音质优化全攻略 在嵌入式音频系统开发中&#xff0c;WM8988作为一款高性能低功耗的音频编解码芯片&#xff0c;因其出色的音质表现和灵活的配置选项&#xff0c;成为众多开发者的首选。然而&#xff0c;很多工程师在完成基础驱动后&#x…...

量子噪声对机器学习模型的影响与缓解策略

1. 量子噪声与机器学习模型的复杂关系量子计算领域近年来最令人兴奋的进展之一&#xff0c;就是量子机器学习&#xff08;QML&#xff09;的兴起。作为一名长期跟踪量子计算发展的从业者&#xff0c;我亲眼见证了量子算法在机器学习任务中展现出的惊人潜力。然而&#xff0c;在…...

别再只盯着应力云图了!用ANSYS Workbench的‘圣维南原理’和模型简化,把你的计算效率提升200%

别再只盯着应力云图了&#xff01;用ANSYS Workbench的‘圣维南原理’和模型简化&#xff0c;把你的计算效率提升200% 有限元分析工程师常常陷入一个误区&#xff1a;认为模型越精细&#xff0c;结果越准确。但现实情况是&#xff0c;一个未经合理简化的复杂模型不仅会消耗大量…...

如何在Windows上快速安装安卓应用:APK Installer终极指南

如何在Windows上快速安装安卓应用&#xff1a;APK Installer终极指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想要在Windows电脑上运行安卓应用&…...

Guitar Pro 8.1.5作为吉他爱好者的练琴神器,其跨平台支持与强大功能值得重点关注。本评测聚焦其核心优势与操作要点,为吉他学习者与原创音乐人提供高效解决方案。跨系统兼容性Guit

Guitar Pro 8.1.5作为吉他爱好者的练琴神器&#xff0c;其跨平台支持与强大功能值得重点关注。本评测聚焦其核心优势与操作要点&#xff0c;为吉他学习者与原创音乐人提供高效解决方案。跨系统兼容性 Guitar Pro 8.1.5同时支持macOS与Windows系统&#xff0c;mac用户无需转战Wi…...

2026年搜索引擎大变革:生成式优化服务如何引领未来趋势

随着AI技术的不断进步&#xff0c;搜索引擎领域正在经历一场前所未有的变革。2026年&#xff0c;我们见证了从传统SEO到生成式引擎优化&#xff08;GEO&#xff09;的重大转变。这场变革不仅改变了用户获取信息的方式&#xff0c;也为企业带来了全新的营销机遇。本文将深入探讨…...

AI Agent开发实战:从核心范式到工程落地的完整指南

1. 项目概述&#xff1a;一场静悄悄的技术代际更迭最近和几个技术团队负责人聊天&#xff0c;话题总绕不开“AI Agent”。大家的感觉出奇地一致&#xff1a;这玩意儿的发展速度&#xff0c;快得有点让人喘不过气。新闻里、论文里、各种技术峰会上&#xff0c;关于智能体&#x…...

AI碳足迹深度解析:从模型压缩到软硬协同的绿色AI实践

1. 从“算力怪兽”到“绿色引擎”&#xff1a;AI碳足迹问题的深度拆解 最近和几个在芯片厂和云服务商工作的老朋友聊天&#xff0c;话题总绕不开一个词&#xff1a;电费。不是开玩笑&#xff0c;现在训练一个大模型&#xff0c;电费账单能轻松超过一个小型数据中心的日常运维成…...