Java反射机制剖析

Java 领域的反射机制深度剖析 本文旨在全面解析Java反射机制的技术本质,涵盖从基础概念到高级应用的完整知识链条。反射机制的核心原理与底层实现反射API的体系结构与关键类库动态类加载与运行时类型操作的具体实现反射在框架设计中的典型应用模式性能优化与最佳实践目标是帮助开发者建立对反射机制的系统性认知,掌握复杂场景下的工程应用技巧。基础概念层:定义核心术语,构建反射机制的理论模型技术实现层:解析Class对象体系,演示反射API的使用方法工程实践层:通过实战案例展示反射在复杂场景中的应用。 阅读详情

java反射机制:

1.指的是可以于运行时加载,探知和使用编译期间完全未知的类.

2.程序在运行状态中, 可以动态加载一个只有名称的类, 对于任意一个已经加载的类,都能够知道这个类的所有属性和方法; 对于任意一个对象,都能调用他的任意一个方法和属性;

3.加载完类之后, 在堆内存中会产生一个Class类型的对象(一个类只有一个Class对象), 这个对象包含了完整的类的结构信息,而且这个Class对象就像一面镜子,透过这个镜子看到类的结构,所以被称之为:反射。

4.每个类被加载进入内存之后,系统就会为该类生成一个对应的Java.lang.Class对象,通过该Class对象就可以访问到JVM中的这个类.

静态加载类和动态加载类的概念区分:

这里写图片描述

与反射有关的类包.

java.lang.reflect.*;和java.lang.Class;

Java中所有类型(包括基本类型)都对应一个Class对象,这个Class就是java.lang.Class。即每一个类型,在Class中都有一个Class对象跟它对应.Class 没有公共构造方法。注意不是没有,是没有公共的.

从Class中获取信息

这里写图片描述

如何获得Class对象

1.针对每一个对象.getCalss(),可以得到对应的Class.

2.Class.forName(String),String的写法:包名.类名.就会创建包名.类名对应的那个对象

注:1.2只适用于引用类型

3.对于基本类型:封装类.TYPE代表了对应的基本类型的Class对象.Integer.TYPE对应的是int的Class对象 
注:3只适用于基本类型

4.类型,Class。<第4种是通用的.> 
上面的4种方法,只有方法2是动态的,只要换一个包就可以了.它具有动态潜质.所以真正意义的想体现动态编程只能使用方法2.

每种类型的Class对象只有一个,即他们的地址只有一个,但是不同类型是不同的.所以下面的打印结果都为true.

//对与引用类型
Class c1 = "".getClass();
Class c2 =     Class.forName("java.lang.String");
Class c3 = String.class;
System.out.println(c1 ==c2);//true
//对于基本类型
Class num1 = Integer.TYPE;
Class num2 = int.class;
System.out.println(num1 == num2);//true
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

反射获取类中的成员的相关方法

[获取构造<根据参数类型>]使用时一般用不带declared的

Constructor<T> getConstructor(Class<?>... parameterTypes) 
      返回一个 Constructor 对象,它反映此 Class 对象所表示的类的指定公共构造方法。 
 Constructor<?>[] getConstructors() 
      返回一个包含某些 Constructor 对象的数组,这些对象反映此 Class 对象所表示的类的所有公共构造方法。 
 Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) 
      返回一个 Constructor 对象,该对象反映此 Class 对象所表示的类或接口的指定构造方法。 
 Constructor<?>[] getDeclaredConstructors() 
      返回 Constructor 对象的一个数组,这些对象反映此 Class 对象表示的类声明的所有构造方法。
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

[获取属性<根据属性名>]使用时一般用是带declared的,因为属性一般都是私有的

Field getField(String name) 
      返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。 
 Field[] getFields() 
      返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。 
 Field getDeclaredField(String name) 
      返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。 
 Field[] getDeclaredFields() 
      返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

[获取方法<方法名加上参数类型>]使用时一般用不带declared的

Method getMethod(String name, Class<?>... parameterTypes) 
      返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。 
 Method[] getMethods() 
      返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。 
 Method getDeclaredMethod(String name, Class<?>... parameterTypes) 
      返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。 
 Method[] getDeclaredMethods() 
      返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。 
 T newInstance() 
      创建此 Class 对象所表示的类的一个新实例。 <new Instance()可以动态的创建对象>
 String toString() 
      将对象转换为字符串。
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

注意:

new Instance()调用的是无参构造,如果该类没有无参构造方法,则newInstance()会产生异常.有declared的方法是支持私有,但是不支持继承,无declared的方法支持继承,不支持私有,且只能取出public的东西.因此取属性的时候一般来说是带declared的,因为属性一般都是私有的,取方法时一般是不带declared的,取构造时一般也是不带declared的.

实例模拟反射获取类中的相关属性和方法

利用反射对属性赋值

Field中的方法 
Object get(Object obj) 
返回指定对象上此 Field 表示的字段的值。 
Field f = c.getXXField(属性名); 
值 = f.get(对象); 
void set(Object obj, Object value) 
将指定对象变量上此 Field 对象表示的字段设置为指定的新值。 
f.set(对象,值); 
Class

    Class c = Student.class;
    Object obj  = c.newInstance();            //创建Student类的对象
    Field f = c.getDeclaredField("name");        //获取name属性
    f.setAccessible(true);                    //设置私有可以访问.
    f.set(obj, "zhangsan");
    System.out.println(f.get(obj));             //获取obj的name属性的值.
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

利用反射调用构造

对于构造真正调用是在调用newInstance()方法时.

Class c = Class.forName("com.clazz.reflect.Student");
    Constructor con = c.getConstructor();         //没有执行构造,
    Object cObj = c.getConstructor().newInstance();//调用无参的构造方法
    Constructor conAll = c.getConstructor(int.class,String.class,int.class);
    Object caobj = conAll.newInstance(1001,"zjamgs",234235);//调用含参的构造方法.
    System.out.println(caobj);                  //打印输出
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

利用反射调用方法

对象.方法名(值1,2,3); 
Method m = c.getMethoed(方法名,参数类型…); 
m.invoke(对象,方法调用的参数 )如果底层方法所需的形参数为 0,则所提供的 args 数组长度可以为 0 或 null。

Class c = Class.forName("com.clazz.reflect.Student");
    Object obj = c.newInstance();    //创建Sutdent对象.
    Method msetName = c.getMethod("setName", String.class);//obj无须转换类型
    msetName.invoke(obj, "zhangsan");//调用方法setName, 并传参.
    Method msetId = c.getMethod("setId", int.class);
    msetId.invoke(obj, 409090202);
    System.out.println(obj);
Zemax与Matlab交互:双胶合优化详细流程 阅读详情

相关推荐

工业以太网通讯Profinet协议详解

Profinet是通过西门子控制系统被广泛使用的工业通信协议,是一种较新的,基于以太网的工业通讯协议。

mydatai的专栏 8851

Java类类getConstructor()方法及示例

类的类getConstructor()方法 (Class class getConstructor() method) getConstructor() method is available in java.lang package. getConstructor()方法在java.lang包中可用。 getConstructor() method is used to return a Co...

cumudi0723的博客 9689

从芯片选型到光学集成:手持激光测距仪硬件设计全解析

本文全面解析手持激光测距仪的硬件设计,从芯片选型到光学集成,详细介绍了相位法测距技术的核心原理与方案选择。通过模块化设计、信号链路优化及PCB布局技巧,实现毫米级精度。文章还分享了量产化关键控制点,帮助工程师规避常见设计陷阱,提升产品可靠性。

weixin_30425949的博客 445

java 反射机制 之 getConstructor获取有参数构造函数 然后newInstance执行有参数的构造函数

java 反射机制 之 getConstructor获取有参数构造函数 然后newInstance执行有参数的构造函数

不废话快上车 2万+

Rancher操作手册(v2.7.5-rc1)

选择需要创建ingress的命名空间 ==》填写ingress名称 ==》在“规则”一栏,选择“Prefix” ==》输入访问路径 ==》选择访问路径对应的service ==》如果需要继续添加访问路径,点击“添加路径”,重复前面的步骤即可。选择需要创建Deployment的命名空间 ==》填写Deployment名称 ==》选择通用 ==》填写容器名称 ==》填写镜像 ==》选择镜像的拉取密文 ==》点击添加端口或Service。点击左侧菜单栏的集群里的“项目/命名空间”,点击右下角的“创建命名空间”。

weixin_60197334的博客 5568

UE5 VlcMedia 插件编译与流媒体播放实战

本文详细介绍了在虚幻引擎5中编译并集成VlcMedia插件以解决流媒体播放难题的实战指南。针对UE5不再默认支持Win32 API导致的编译错误,文章提供了核心的构建配置文件修改步骤,并指导如何启用插件、创建VLC媒体播放器,最终成功播放如.m3u8等格式的网络直播流或点播视频。

weixin_29013129的博客 338

C#反射中的GetConstructor与GetConstructors构造函数参数的获取

编写代码时构造函数参数的获取需要用到反射中的GetConstructor与GetConstructors来实现,在具体使用的时候难点就在于他们的参数相对其他的反射类的内置函数要复杂一些,这里我们用代码实例的方式介绍给大家

河西~石头 3914

新手避坑指南:用Silvaco Atlas搞定GaN HEMT电热仿真的完整流程(附代码解读)

本文详细介绍了使用Silvaco Atlas进行GaN HEMT电热特性仿真的完整流程,特别针对新手常见问题提供避坑指南。从软件环境配置、结构定义、网格划分到物理模型设置,逐步解析关键步骤,并附有代码解读和调试技巧,帮助读者快速掌握GaN器件仿真的核心技术。

weixin_29215815的博客 595

【Java反射-56.3】Java中的getConstructors()方法:使用与原理深度解析

是类中的一个方法,用于获取当前类的所有公共构造函数(即public修饰的构造函数)。这些构造函数以对象数组的形式返回。返回一个包含对象的数组,每个对象代表类的一个公共构造函数。如果类没有公共构造函数,或者当前类是原始类型、数组类型或void,则返回一个空数组。方法是Java反射机制中的重要工具,它允许我们动态获取类的公共构造函数信息。通过结合类的其他方法(如),我们可以实现动态创建对象、框架开发等高级功能。然而,反射操作也有一定的性能开销和安全性风险,因此在实际开发中应谨慎使用。

weixin_39033358的博客 1551

《信息化项目文档模板十二——业务需求新增/变更审批确认表 》

系列文章目录 《信息化项目文档模板一——项目需求说明书》 《信息化项目文档模板二——项目启动会文档模板》 《信息化项目文档模板三——会议纪要模板》 《信息化项目文档模板四——系统项目蓝图设计模板》 《信息化项目文档模板五——系统详细设计模板》 《信息化项目文档模板六——系统详细设计模板》 《信息化项目文档模板七——系统开发计划模板》 《信息化项目文档模板八——系统功能测试模板》 《信息化项目文档模板九——系统压力测试模板》 《信息化项目文档模板十——系统推广上线计划模板》 《信息化项目文档模板十一——系统用

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 1712

SCTPPortScan SCTP协议端口扫描、关联地址识别、传输状态检测

Windows:Winsock2+SCTP扩展)。- **SCTP API封装**:Linux下直接调用`socket()`、`connect()`、`getsockopt()`等系统函数,解析`struct sctp_status`和`struct sctp_paddrinfo`获取状态和关联地址。qDebug() << "开始SCTP扫描:" << ipList.size() << "个IP," << ports.size() << "个端口,共" << m_totalTasks << "个任务";

寒寒豆豆软件公司的博客 90

getConstructor()与getDeclaredConstructor()方法的区别及setAccessible()方法的作用(超详细)

今天在使用反射创建java对象的时候,遇到了点小问题,查看API文档关于getConstructor()和getDeclaredConstructor()方法写的解释模糊不清,就写了几个测试,验证了getConstructor()与getDeclaredConstructor()方法的区别: 首先上代码: @Getter@Setter public class HelloWorld { pri...

iwlnner的博客 9764

微信小程序 - 解决web-view嵌套H5网页白屏问题,将h5网页嵌套在webview页面出现无法加载一片空白,详解微信小程序<web-view>页面跳转出现白屏情况(无论本地还是线上H5都能解决)

微信小程序解决web-view打开网页在手机上出现白屏的问题,小程序web-view嵌套H5项目白屏问题分析及解决,使用web-view组件加载H5网页链接后白屏情况,小程序嵌套的h5网页中跳转页面时也有可能出现白屏问题,嵌套webview页面时,出现白屏,WebView 加载不出网页,微信小程序<web-view>页面跳转出现白屏解决方法,解决WebView白屏空白,H5内嵌第三方小程序打开白屏,微信小程序嵌入h5页面加载空白,微信小程序web-view跳转h5白屏,解决微信小程序web-view打开网页

🏆 前端领域优质创作者 1万+

Java反射机制深入剖析

Java反射机制是Java语言的一个强大特性,它提供了无与伦比的灵活性和动态能力。然而,这种灵活性是有代价的,包括性能开销和潜在的安全风险。1. 理解Java反射机制。3. 实例化对象与调用方法。2. 反射在工具类中的使用。Java反射机制深入剖析。一、反射概念与基本操作。2. 反射的启动点:类。二、高级特性与框架集成。1. 动态代理与AOP。四、案例分析与最佳实践。1. 框架设计中的应用。三、性能、安全与限制。1. 反射的性能影响。2. 反射的安全风险。

N201871643的博客 452

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

JAVA 反射机制:从原理剖析到实战应用

本文摘要: JAVA反射机制是运行时动态操作类和对象的核心技术,通过反射可以在编译期未知类信息的情况下获取类的完整结构并执行操作。文章系统介绍了反射的核心概念与底层原理,重点讲解了获取Class对象的三种方式(Class.forName()、.class属性、getClass()方法)以及如何通过反射API获取类的基本信息、构造方法、成员变量和方法。反射机制打破了传统静态编程的限制,为框架开发、动态代理等场景提供了强大的灵活性,但同时也需要注意性能优化和合理使用。掌握反射技术是JAVA高级开发的必备技能。

今天比昨天更努力一点! 1万+

NTscan扫描工具

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

剖析 Java 的反射机制在测试框架中的应用:以 JUnit 为例

反射机制是 Java 语言的一个重要特性,它允许程序在运行时动态地获取类的信息,包括类的属性、方法、构造函数等,并且可以在运行时调用这些属性和方法。反射机制的核心类包括ClassMethodField和等。JUnit 是一个开源的 Java 单元测试框架,它提供了一系列的注解和断言方法,用于编写和运行测试用例。JUnit 的核心思想是将测试代码和生产代码分离,通过编写独立的测试用例来验证生产代码的正确性。

潜意识Java的博客 1178

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java反射机制:原理剖析与实战指南

场景说明示例框架开发动态创建对象Spring IOC动态代理运行时增强AOP注解处理运行时解析Lombok泛型擦除获取泛型信息JacksonJava反射机制是框架开发的基石,掌握好反射技术对于理解主流框架的实现原理至关重要。记住:反射虽强大,但也要适度使用,在灵活性和性能之间找到平衡!📚 下一篇我们将深入讲解Java注解机制,敬请期待!

m0_65382359的博客 756

深入Java反射机制:原理剖析与高阶实践指南

Java反射建立在JVM的类型系统之上,通过Class对象实现类信息的运行时访问。

2301_77129242的博客 900

Java反射机制原理剖析与动态代理实践

本文介绍了Java反射机制的核心原理及其在动态代理中的实践应用。首先,剖析了反射的API、Class对象生成及访问控制绕过等基础知识;其次,深入探讨动态代理的字节码生成机制,并结合电商平台的权限控制场景,提供详细代码示例说明如何提升系统灵活性;此外,针对常见误区如性能瓶颈和安全风险,给出缓存机制和CGLIB集成等解决方案。

等风来 858

Java SE 061 Java反射机制深度剖析

(1)一个人只要自己不放弃自己,整个世界也不会放弃你. (2)天生我才必有大用 (3)不能忍受学习之苦就一定要忍受生活之苦,这是多么痛苦而深刻的领悟 (4)做难事必有所得 (5)精神乃真正的刀锋 (6)战胜对手有两次,第一次在内心中. (7)编写实属不易,若喜欢或者对你有帮助记得点赞+关注或者收藏哦~ Java SE 061 Java反射机制深度剖析 文章目录Java SE 061 Java反射机制深度剖析1.java语言的反射机制1.1为什么需要反射机制1.2java反射机制主要提供了以下功能2.通过.

青风百草 355

深入剖析Java的反射机制

一、反射机制的具体概念表述: 关于反射:在计算机领域,反射指的是一种能够自我描述以及自我控制的应用。 引用维基百科的解释: 在计算机学中,反射(英语:reflection)是指计算机程序在运行时(runtime)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。 要注意术语“反射”和“内省”(type introspection)的关系。内省(或称“自省”)机制仅指程序在运行时对自身信息(称为元数据)的检测;反射机制不仅包括要能在运行时对程

MichaelSuns的博客 296

Java反射机制剖析(四)-深度剖析动态代理原理及总结

动态代理类原理(示例代码参见java反射机制剖析(三)) a) 理解上面的动态代理示例流程 a) 理解上面的动态代理示例流程 b) 代理接口实现类源代码剖析 咱们一起来剖析一下代理实现类($Proxy0)的源代码和整个动态代理的流程。 $Proxy0生成的代码如下: import java.lang.reflect.Invo...

dengkuituo0680的博客 86

Java反射机制剖析(一)-定义和API

1.     什么是Java反射机制Java的反射机制是在程序运行时,能够完全知道任何一个类,及其它的属性和方法,并且能够任意调用一个对象的属性和方法。这种运行时的动态获取就是Java的反射机制。其实这也是Java是动态语言的一个象征。用一句话来概括反射就是加载一个运行时才知道的类以及它的完整内部结构。2.     为什么要有Java反射机制我们为什么要用Java的反射机制呢?我认为有两种:第一种

Q 1万+

Java反射机制深度剖析:从原理到高阶应用

未来随着Java平台的演进,反射机制将继续在灵活性与性能、安全之间寻求平衡。开发者应紧跟技术发展,在理解原理的基础上合理运用反射,构建既灵活又健壮的Java应用。

xiaozhi_wei的博客 940

Java反射机制:优缺点深度剖析

在Java编程世界中,反射机制是一项强大且灵活的功能,它允许程序在运行时动态地获取类的信息、调用方法、访问字段等。这一特性极大地增强了Java的动态性和可扩展性,但同时也带来了一些不可忽视的缺点。本文将深入探讨Java反射机制的优缺点,帮助开发者更好地理解并合理使用这一功能。

2403_86822198的博客 828
上一篇: 安卓微信自动抢红包插件 实现 和优化
下一篇: Java反射机制详解
Footloose_
博客等级 码龄10年 254粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值