不会吧,真的还有Java最强大的技术之一:反射都没搞懂?那你还不停下来好好的看看

Java 反射:运行时自省的强大工具 Java反射是一种强大的运行时机制,允许程序在运行时检查和操作类、方法、字段等,而无需事先知道它们的具体类型。反射的核心是java.lang.Class类,通过它可以获取类的结构信息、动态创建实例、调用方法或访问字段。反射在框架(如Spring、Hibernate)、插件系统和开发工具中广泛应用,提供了灵活性和动态性。然而,反射也存在性能开销、API复杂性、安全风险等挑战,尤其是在Java 9引入模块系统后,反射的访问受到更严格的限制。开发人员应谨慎使用反射,优先考虑静态类型和接口,仅在必要时使用反射以构建 阅读详情

相信很多人都知道反射可以说是Java中最强大的技术了,它可以做的事情太多太多,很多优秀的开源框架都是通过反射完成的,比如最初的很多注解框架,后来因为java反射影响性能,所以被运行时注解APT替代了,java反射有个开源框架jOOR相信很多人都用过,不过我们还是要学习反射的基础语法,这样才能自己写出优秀的框架,当然这里所讲的反射技术,是学习Android插件化技术、Hook技术等必不可少的!

概述

Java 反射是可以让我们在运行时获取类的方法、属性、父类、接口等类的内部信息的机制。也就是说,反射本质上是一个“反着来”的过程。我们通过new创建一个类的实例时,实际上是由Java虚拟机根据这个类的Class对象在运行时构建出来的,而反射是通过一个类的Class对象来获取它的定义信息,从而我们可以访问到它的属性、方法,知道这个类的父类、实现了哪些接口等信息。

何为反射?

Java的 反射机制 是在运行状态中,对于任意一个类,都能够 知道这个类的所有属性和方法 ;对于任意一个对象,都能够 调用它的任意一个方法和属性 ;这种 动态获取的信息以及动态调用对象的方法的功能 称为 Java 语言的反射机制。

简而言之,只要你给我一个 .class ——类的名字,我就能通过反射获取到类的属性和方法。

反射是很多高级技术的基础,Java 中的注解、动态代理,各种框架注入 Spring 、 MyBatis 等都用到了反射技术。

反射机制能做什么

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

Class类

我们知道使用javac能够将.java文件编译为.class文件,这个.class文件包含了我们对类的原始定义信息(父类、接口、构造器、属性、方法等)。.class文件在运行时会被ClassLoader加载到Java虚拟机(JVM)中,当一个.class文件被加载后,JVM会为之生成一个Class对象,我们在程序中通过new实例化的对象实际上是在运行时根据相应的Class对象构造出来的。确切的说,这个Class对象实际上是java.lang.Class泛型类的一个实例,比如Class对象即为一个封装了MyClass类的定义信息的Class实例。由于java.lang.Class类不存在公有构造器,因此我们不能直接实例化这个类,我们可以通过以下方法获取一个Class对象。

Class 类在 JDK 中的定义

public final class Class<T>
extends Object
implements Serializable, GenericDeclaration, Type, AnnotatedElement
复制代码

类 Class 的实例表示运行中的 Java 应用程序中的类和接口。

枚举 是一种类,注释 是一种接口。

每个 数组 也属于一个类,这个类反映为一个 类对象 ,由具有相同元素类型和维数的所有数组共享。

原始Java类型(布尔型、字节型、char型、short型、int型、long型、float型和double型)和关键字void也被表示为类对象。

类的加载过程

Class类的实例表示正在运行的Java应用程序中的类和接口。每个类只会产生一个Class对象,在类加载的时候自动创建

获取Class类的三种方式

1 通过 class.forname()来获取Class对象

Class clazz = Class.forName("com.mashibing.entity.Emp");
        System.out.println(clazz.getPackage());
        System.out.println(clazz.getName());
        System.out.println(clazz.getSimpleName());
        System.out.println(clazz.getCanonicalName());

2 通过类名.class来获取Class对象

Class<Emp> clazz = Emp.class;
        System.out.println(clazz.getPackage());
        System.out.println(clazz.getName());
        System.out.println(clazz.getSimpleName());
        System.out.println(clazz.getCanonicalName());

3 通过对象的getClass()来获取Class对象

Class clazz = new Emp().getClass();
        System.out.println(clazz.getPackage());
        System.out.println(clazz.getName());
        System.out.println(clazz.getSimpleName());
        System.out.println(clazz.getCanonicalName());

4如果是一个基本数据类型,那么可以通过Type的方式来获取Class对象

Class type = Integer.TYPE;
        
        System.out.println(type.getName());
        System.out.println(type.getCanonicalName());

反射常用到的API

  • 获取类的构造方法:
  • public Constructor<T> getConstructor(Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException public Constructor<?>[] getConstructors() throws SecurityException 复制代码
  • 获取类的成员变量
  • public Field getField(String name) throws NoSuchFieldException, SecurityException public Field[] getFields() throws SecurityException 复制代码
  • 获取类的方法
  • public Method getMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException public Method getMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityExceptio

反射在 Spring 中的应用举例

反射在众多框架中都有普遍的应用。比如 Spring IOC 容器帮我们实例化众多的bean,下面我们简单模拟一下 反射 在其中起到的作用。

此处使用的案例接这篇:【设计模式】代理模式那些事儿:静态代理,动态代理,JDK的动态代理,cglib,Spring AOP

Spring 配置文件:

<bean id="pony" class="com.xblzer.dp.proxy.springaop.Pony"></bean>
复制代码

使用的时候直接这样就能拿到定义的类了:

ApplicationContext ctx = new ClassPathXmlApplicationContext("app_aop.xml");
Pony pony = (Pony) ctx.getBean("pony");
复制代码

那么是怎么做到的呢?就是通过 反射 。

Spring 通过配置文件实例化对象,并将其放到容器的过程大概就是(模拟):

本文到此结束啦,​提供一个小福利,对于想要跳槽 换工作的可以私信我免费领取架构师学习资料;了解最新的学习动态;了解最新的阿里、京东招聘资讯;获取更多的面试资料。最后希望大家能从文章中得到帮助获得收获,也可以评论出你想看哪方面的技术。文章会持续更新,希望能帮助到大家,哪怕是让你灵光一现。喜欢的朋友可以点点赞和关注,也可以分享出去让更多的人看见,一起努力一起进步!一起加油!

一文搞懂Java反射 反射机制被称为Java的"元编程能力",Spring、MyBatis等主流框架底层都重度依赖它。本文将深入剖析反射的核心原理,并通过实战代码演示其强大威力! 阅读详情

相关推荐

比反射更强大的技术,内省技术

在学习Java过程中,总是层层递进的。差不多从数据类型到IO、异常就算基础部分(不同书不一样)。之后就是Java的进阶,一般我们都会学到泛型、反射之类的。今天要说的东西,就和反射有关系,叫做“内省技术”。“内省技术”是基于反射技术的,提供了更多的便于操作JavaBean的API。一般的话,我们只有学到JavaWeb才会称呼JavaBean,由此可知“内省技术”属于JavaWeb的内容(搞笑逻辑,别...

ZackSock的博客 3188

java是很厉害的么_java总是很强大吗?

作为一名Java程序员,我不得不说您的问题本身就是一个伪命题. Java不仅强大,而且受到批评.如果您问java一年四季在tiobe中排名第一,我可以说几点:1. Java阈值很低. Java设计师可以说,人们的智商已经得到充分考虑. 所有更复杂的事物都将被删除或自动完成,例如垃圾回收机制,该机制阻止了程序员对内存的直接操作. 当然,更好地说java有多强大,这减少了误操作的可能性. 某些后...

weixin_39685130的博客 683

VCS多lib编译实战:如何高效处理Verilog模块重命名与分开编译

本文深入探讨了在复杂SoC设计中,如何利用VCS工具实现多库编译,以高效处理Verilog模块重命名与分开编译的工程难题。通过解析synopsys_sim.setup配置、Config映射机制,并提供完整的自动化脚本实战指南,帮助工程师构建健壮、可维护的编译环境,从而显著提升大型项目的编译效率和代码管理灵活性。

weixin_29169505的博客 357

Java中强大的format

Java中强大的format 原文链接:http://www.jianshu.com/p/c8f16cab35e1# Java中允许我们对指定的对象进行某种格式化,从而得到我们想要的格式化样式。 Format 首先介绍java.text包中的Format Foramt是一个抽象基类,其具体子类必须实现 format(Object obj, StringBuffer to

joenqc的博客 3万+

STM32H743+YT8512C以太网通信实战:CubeMX与LWIP配置详解

本文详细解析了基于STM32H743微控制器与YT8512C PHY芯片的以太网通信实战方案。通过CubeMX工具进行RMII接口、MPU、时钟树等关键硬件配置,并重点阐述了如何修改LWIP协议栈驱动代码以适配YT8512C芯片,解决了LAN8742驱动不兼容的问题。文章提供了从工程创建、代码适配到调试验证的完整步骤,帮助开发者快速实现稳定可靠的嵌入式网络连接。

weixin_29190573的博客 559

ThingsKit物联网平台产品管理之物模型

物模型是ThingsKit物联网平台为产品定义的数据模型,用于描述产品的功能。本文介绍物模型相关概念和使用限制。

云腾五洲官方博客 1174

JAVA的强大之处

  图形  界面 底层之间的关联  还有windows原理 内部的机制如何形成 今天去头他们家给我讲的   熟悉内存如何分配  文件管理  进程间还有内存是如何联系的 等等都是要熟悉的 打算发工资去买2本书一本是很强大的windows 的内部说明 还有就是JAX   jscript   脚本的写法  数据库的应用!保证每天11点睡觉  破解的 等等 我要做的事情还很多很多   哎  一件一件来吧 

pl2597758的专栏 1283

TruckSim与Simulink联合仿真中的车轮转角精确控制策略

本文深入探讨了TruckSim与Simulink联合仿真中实现车轮转角精确控制的关键策略。针对多轴车辆路径跟踪时转角指令失灵的常见问题,核心在于正确配置TruckSim转向轴的外部输入模式(Advanced Settings),并确保仿真接口的稳定搭建。文章详细解析了从单轴到多轴协同转向的配置方法,并提供了提升MPC路径跟踪精度的实战技巧与调试经验。

weixin_29035147的博客 367

Java反射技术详解

前言 相信很多人都知道反射可以说是Java中最强大的技术了,它可以做的事情太多太多,很多优秀的开源框架都是通过反射完成的,比如最初的很多注解框架,后来因为java反射影响性能,所以被运行时注解APT替代了,java反射有个开源框架jOOR相信很多人都用过,不过我们还是要学习发射的基础语法,这样才能自己写出优秀的框架,当然这里所讲的反射技术,是学习Android插件化技术、Hook技术等必不可...

黄林晴 24万+

《AgentScope-Java 深入浅出教程》第10章 RAG 知识检索

RAG(Retrieval-Augmented Generation,检索增强生成)是一种将信息检索与文本生成相结合的技术架构。它通过从外部知识库中检索相关文档,将检索到的信息作为上下文注入到语言模型的提示中,从而增强模型的回答质量。│ RAG 工作流程 ││ ││ 用户问题 向量检索 上下文增强 生成回答 ││ ▼ ││ │ A │ ││ ││ 1. 接收问题 ││ 2. 将问题转换为向量,在知识库中检索相似文档 ││ 3. 将检索到的文档作为上下文添加到提示词中 │。

步子哥的博客 462

利用CAT12做皮层指标的统计分析及可视化笔记记录

利用CAT12做皮层指标的统计分析及可视化 文章目录利用CAT12做皮层指标的统计分析及可视化前言一、统计步骤1.Basic Models2.Estimate Surface Models3.Results二、可视化1.t值可视化2.p值可视化 前言 本来没有打算做SBM的,因为自己是新手小白,许多操作都不太懂,但最后还是打算做一下,于是就从上周末开始将很久之前跑VBM得到的surf文件夹中的数据捡起来继续做皮层分析,因为之前看了一个博主的博客,关于如何做SBM已经讲得非常清楚了,但是在统计及可视化这里,我

weixin_52073820的博客 8094

java的上乘武功,反射,好好玩哦,绝对值得收藏

各位大侠们知道Java的反射是什么吗?可不是反着发射什么的哈

二当家的白帽子 1万+

字节最新开源模型 DA3(Depth Anything 3)使用教程(一)从任意视角恢复视觉空间

本文介绍DepthAnything3(DA3)模型,一种能够从任意视觉输入中预测几何结构的创新解决方案。DA3采用Transformer骨干网络,通过统一的深度光线表示简化学习过程,支持单目/多视角深度估计、姿态估计和3D高斯预测等多项任务。模型系列包含基础版、度量级和单目专用版本,其中嵌套版本DA3NESTED-GIANT-LARGE表现最佳。代码库提供交互界面、CLI工具和多格式导出功能,支持模块化扩展。实验表明DA3在各项任务上超越现有模型,所有训练数据均来自公开学术数据集。

2506_90492529的博客 2548

不是吧,还有人连Java最强大的技术之一:反射还没搞懂?赶紧码住

Java 反射是可以让我们在运行时获取类的方法、属性、父类、接口等类的内部信息的机制。也就是说,反射本质上是一个“反着来”的过程。我们通过new创建一个类的实例时,实际上是由Java虚拟机根据这个类的Class对象在运行时构建出来的,而反射是通过一个类的Class对象来获取它的定义信息,从而我们可以访问到它的属性、方法,知道这个类的父类、实现了哪些接口等信息。复制代码类 Class 的实例表示运行中的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组也属于一个类,这个类反映为一个。

qingyangcc123的博客 489

瑞芯微RV1109平台GT911触摸屏驱动调试记录1

很明显这里可以看到系统已经配置了i2c-0、i2c-1、i2c-3、i2c-4、i2c-5,当开机的时候系统已经将相应的I2C节点注册成功了,说明I2C部分是没有问题的。

bingdund的博客 297

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Java中最强大的技术之一 反射 获取子父类方法及属性

Java中最强大的技术之一  反射  获取子父类方法及属性前言1、 clazz.getFields()获取成员变量2、 clazz.getDeclaredFields()获取当前类的所有属性3、 clazz.getMethods()获取当前对象及父类对象的所有公共方法4、 clazz.getDeclaredMethods()获取当前类中所有的方法5、反射 给属性赋值并打印6、反射 调用方法7、 clazz.getConstructors()获取对象的所有构造方法8、

ws13575291650的博客 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java最强大的技术之一:反射

类 Class 的实例表示运行中的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组也属于一个类,这个类反映为一个类对象,由具有相同元素类型和维数的所有数组共享。原始Java类型(布尔型、字节型、char型、short型、int型、long型、float型和double型)和关键字void也被表示为类对象。

IT枫斗者的博客 215

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java中最强大的技术之一 反射 获取Class类

Java中最强大的技术之一  反射  获取Class类1、反射概述2、类的加载过程3、获取Class类的三种方式3.1 通过 class.forname()来获取Class对象3.2 通过类名.class来获取Class对象3.3 通过对象的getClass()来获取Class对象3.4如果是一个基本数据类型,那么可以通过Type的方式来获取Class对象 1、反射概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个

ws13575291650的博客 1万+

彻底搞懂java反射技术及其原理

概述:反射是java中最强大的技术之一,很多高级框架都用到了反射技术,面试中也是经常问的点,所以搞懂反射非常重要! 文章目录1.反射是什么?2.反射的底层原理3.反射在spring IOC容器中的使用3.反射的常用API 1.反射是什么? java反射机制指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法功能称为java语言的反射机制. 丢一个堆概念,大家可能看的就懵逼了,接下来举个简单的例子让大家来

weixin_45593271的博客 1536

Java 反射的作用详解:为什么说它是 Java 中最强大的特性之一?

Java反射机制是运行时动态操作类和对象的核心技术,广泛应用于框架开发。核心功能包括动态加载类、创建对象、调用方法和访问字段,支持Spring IOC、ORM映射、JSON序列化等典型场景。反射通过注解解析和动态代理实现灵活开发,但也存在性能损耗和安全隐患。最佳实践建议封装工具类、使用缓存和泛型,避免高频调用。作为Java高级特性,反射为框架设计和扩展提供了基础能力,但需权衡灵活性与性能成本。合理运用反射能显著提升代码通用性和可维护性。

weixin_73962764的博客 842

Java中最强大的技术之一 反射 一个方法实现对所有表的查询

Java中最强大的技术之一  反射  一个方法实现对所有表的查询前言1、一个方法实现对所有表的查询Dept类Emp类DBUtilTest工具类 前言 反射在一定程度上破坏了封装性,需要合理使用 Dept类 Emp类 DBUtilTest工具类 三个类的代码在文章最下方 1、一个方法实现对所有表的查询 要查询N张表的数据,但是不想写N多的方法,能否写一个方法完成所有表的查询工作 public class BaseDaoImpl { /** * 统一的查

ws13575291650的博客 1万+

工欲善其事必先利其器,反射你真的掌握了吗?本文详细给你讲解,没时间看的建议收藏!!!

  本文继续来给大家巩固基础,详细的来给大家介绍下反射的原理。Java Reflection 探寻反射的本质 1. 反射快速入门 反向探知,在程序运行过程中动态的获取类的相关属性 这种动态获取类的内容以及动态调用对象的方法和获取属性的机制.就叫做JAVA的反射机制 /** * 反射的基本应用 * @param args */ public static void main(String[] args) throws Exception {

波波烤鸭的博客 1576

【反射入门】:强大又危险的Java机制

反射是 Java 提供的一种强大机制,允许程序在运行时动态地获取类的结构信息,并对其进行操作。本文将从简单的创建反射入手,走进丰富又深入的反射探索之路。

weixin_47510148的博客 1156
上一篇: Java这条路只要:只要不要走弯路,那就是捷径了
下一篇: 大厂的Java面试可以直接让你怀疑人生,这些面试题目你有遇到过?
在酒吧写代码
博客等级 码龄7年 210粉丝 330原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值