java系列文章之反射

news2025/1/17 4:02:11

文章目录

  • 一、动态语言
  • 二、反射机制概念
  • 三、反射的应用场合
    • 1. 编译时类型和运行时类型
    • 2. 编译时类型无法获取具体方法
  • 四、 反射 API
  • 五、反射使用步骤
  • 六、获取 Class 对象的 3 种方法
  • 七、创建对象的两种方法
  • 总结


一、动态语言

  • 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结构上的变化。比如常见的 JavaScript 就是动态语言,除此之外 Ruby,Python 等也属于动态语言,而 C、C++则不属于动态语言。从反射角度说 JAVA 属于半动态语言。

二、反射机制概念

  • 在 Java 中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能成为 Java 语言的反射机制
    在这里插入图片描述

三、反射的应用场合

1. 编译时类型和运行时类型

  • 在 Java 程序中许多对象在运行是都会出现两种类型:编译时类型和运行时类型。 编译时的类型由声明对象时实用的类型来决定,运行时的类型由实际赋值给对象的类型决定 。如:
    Person p=new Student();
    
    其中编译时类型为 Person,运行时类型为 Student。

2. 编译时类型无法获取具体方法

  • 程序在运行时还可能接收到外部传入的对象,该对象的编译时类型为 Object,但是程序有需要调用该对象的运行时类型的方法。为了解决这些问题,程序需要在运行时发现对象和类的真实信息。然而,如果编译时根本无法预知该对象和类属于哪些类,程序只能依靠运行时信息来发现该对象和类的真实信息,此时就必须使用到反射了。

四、 反射 API

  • 反射 API 用来生成 JVM 中的类、接口或则对象的信息。
    1. Class 类:反射的核心类,可以获取类的属性,方法等信息。
    2. Field 类:Java.lang.reflec 包中的类,表示类的成员变量,可以用来获取和设置类之中的属性值。
    3. Method 类: Java.lang.reflec 包中的类,表示类的方法,它可以用来获取类中的方法信息或者执行方法。
    4. Constructor 类: Java.lang.reflec 包中的类,表示类的构造方法

五、反射使用步骤

  • 获取想要操作的类的 Class 对象,他是反射的核心,通过 Class 对象我们可以任意调用类的方法。
  • 调用 Class 类中的方法,既就是反射的使用阶段。
  • 使用反射 API 来操作这些信息

六、获取 Class 对象的 3 种方法

  • 调用某个对象的 getClass()方法

    Person p=new Person();
    Class clazz=p.getClass();
    
  • 调用某个类的 class 属性来获取该类对应的 Class 对象

    Class clazz=Person.class;
    
  • 使用 Class 类中的 forName()静态方法(最安全/性能最好)

    Class clazz=Class.forName("类的全路径"); (最常用)
    
  • 当我们获得了想要操作的类的 Class 对象后,可以通过 Class 类中的方法获取并查看该类中的方法和属性。

//获取 Person 类的 Class 对象
Class clazz=Class.forName("reflection.Person");
//获取 Person 类的所有方法信息
Method[] method=clazz.getDeclaredMethods();
for(Method m:method){
	System.out.println(m.toString());
}
//获取 Person 类的所有成员属性信息
Field[] field=clazz.getDeclaredFields();
for(Field f:field){
	System.out.println(f.toString());
}
//获取 Person 类的所有构造方法信息
Constructor[] constructor=clazz.getDeclaredConstructors();
for(Constructor c:constructor){
	System.out.println(c.toString());
}

七、创建对象的两种方法

  • Class 对象的 newInstance()
    1. 使用 Class 对象的 newInstance()方法来创建该 Class 对象对应类的实例,但是这种方法要求该 Class 对象对应的类有默认的空构造器。
  • 调用 Constructor 对象的 newInstance()
    1. 先使用 Class 对象获取指定的 Constructor 对象,再调用 Constructor 对象的 newInstance()方法来创建 Class 对象对应类的实例,通过这种方法可以选定构造方法创建实例。
//获取 Person 类的 Class 对象
Class clazz=Class.forName("reflection.Person"); 
//使用.newInstane 方法创建对象
Person p=(Person) clazz.newInstance();
//获取构造方法并创建对象
Constructor c=clazz.getDeclaredConstructor(String.class,String.class,int.class);
//创建对象并设置属性
Person p1=(Person) c.newInstance("李四","男",20);

总结

以上是整理的反射相关知识,供大家学习和记录,如有问题欢迎指正。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/155794.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

读书:《5%的改变》

《5%的改变》 我们并不需要100%的改变,彻底推翻以前的旧习惯,对于绝大多数人来说,并不太现实,不如考虑一下只改变5%。 一天结束,22:00,开始为睡觉做准备,反思一下,发现今天好像什…

Pytorch LSTM实现中文单词预测(附完整训练代码)

Pytorch LSTM实现中文单词预测(附完整训练代码) 目录 Pytorch LSTM实现中文单词预测(词语预测 附完整训练代码) 1、项目介绍 2、中文单词预测方法(N-Gram 模型) 3、训练词嵌入word2vec(可选) 4、文本预处理 (1&…

Java面向对象之继承

目录继承概述、使用继承的好处总结继承的设计规范、内存运行原理总结继承的特点总结继承后:成员变量、成员方法的访问特点总结继承后:方法重写继承后:子类构造器的特点总结继承后:子类构造器访问父类有参构造器总结this、super使用…

k8s之DaemonSet

写在前面 假定现在有一个这样的需求,需要收集每个Node的运行状态信息,并进行上报,假设有4个节点,我们可以使用Deployment 来实现吗?好像是可以的,我们只需要将repliacas设置为4不就行了,但是de…

怎样让公司全员贡献结构化内容?

- 1 - 问题 一个朋友在一个生产型企业的文档团队负责产品文档,他们使用DITA来编写各类文档,比如:公司管理文档、产品介绍、产品使用说明、产品安装手册等。 DITA 是基于XML的体系结构,用于编写、制作、交付面向主题的信息类型…

【NI Multisim 14.0 操作实例——音量控制电路】

目录 序言 一、音量控制电路 🍊1.设置工作环境 🍊 2.设置原理图图纸 🍊 3.设置图纸的标题栏 🍊 4.放置元器件 🍊 5.编辑元器件属性 🍊 6. 布局元器件 序言 NI Multisim最突出的特点之一就是用户界面…

数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 (一)四选一多路器

数字IC设计、验证、FPGA笔试必会 - Verilog经典习题 (一)四选一多路器 🔈声明: 😃博主主页:王_嘻嘻的CSDN博客 🧨未经作者允许,禁止转载 🔑系列专栏: &#x…

Mercurius <11.5.0 存在拒绝服务漏洞(CVE-2023-22477)

漏洞描述 Mercurius 是NPM仓库中的开源组件,用作于 Fastify Web 框架的 GraphQL 适配器。 11.5.0 之前版本的 Mercurius 开启“订阅”功能时,任何 Mercurius 用户都可以通过 WebSocket 向 /graphql 端点(如:ws://127.0.0.1:1337…

【屏幕驱动移植】点亮OLED屏幕并播放视频

写在前面 硬件软件准备: 名称备注屏幕SSD1106本文章所使用的的屏幕型号,仅仅作为驱动移植示例,其他型号的都可以按照本文的方法推广树莓派3B用于驱动屏幕,树莓派2B3B4B等型号都可以ESP32开发板用于驱动屏幕,具体是ESP32还是ESP32…

都2023年啦~用python来玩一次股票.....

人生苦短,我用python 这不是2023年已经来了吗? 总不能空着手回去吧? 这次简单用python来玩一下股票~ 本章源码更多电子书点击文末名片~ 准备工作 我们需要使用这些模块,通过pip安装即可。 后续使用的其它的模块都是Python自…

启动jeecg-boot框架(vue3版本)

jeecg-boot框架(vue3版本)一、简介二、项目启动1.前端模组:jeecgboot-vue3-master2.后端模组:jeecg-boot-master3.环境要求:4.数据库准备:5.前端启动:6.redis启动:7.后端启动&#x…

(Matlab实现)基于蒙特卡诺和拉格朗日乘子法的电动车调度【有序、无序充放电】

目录 1 概述 2 蒙特卡洛模拟方法介绍 3 拉格朗日乘子法 4 规模化电动汽车充电负荷预测计算方法 5 Matlab代码实现 1 概述 电动汽车EV(Electric Vehicle)具有清洁环保、高效节能的优点,不仅能缓解化石能源危机,而且能够有效地减少温室气体的排放。2015年10月,国…

Day 7 Spring 整合第三方框架

xml整合第三方框架有两种整合方案:不需要自定义名空间,不需要使用Spring的配置文件配置第三方框架本身内容,例如: MyBatis;需要引入第三方框架命名空间,需要使用Spring的配置文件配置第三方框架本身内容,例如: Dubbo.1 整合MyBati…

Apollo星火计划学习笔记——Control 专项讲解(PID)

文章目录1. PID算法介绍1.1 时间连续与时间离散1.2 位置式与增量式1.3 PID算法扩展2. PID调试方法3. APOLLO代码介绍3.1 PID算法3.2 积分饱和问题3.3 纵向控制代码3.3.1 构造函数3.3.2 加载各种纵向控制的配置参数3.3.3 二阶巴特沃斯低通滤波器《数字信号处理》3.3.4 插值出油门…

PMP考试是什么?适合哪些人来学呢?

PMP,根据PMI的解释,就是项目管理专业人士资格认证,全称如下图:PMP考试是由PMI发起、组织和出题,严格评估项目管理专业人士知识技能是否具有高品质的资格认证考试。PMI:美国项目管理协会(Project…

【小米路由器3】breed刷机救砖-nand flash硬改SPI flash-编程器救砖(解决ttl无法救砖问题)

大家好,我是老子姓李!(gzh:楠瘦) 本博文带来【小米路由器3】变砖,ttl无法救砖,硬改焊接一块SPI flash,使用编程器刷入小米路由器mini的breed最终成功救砖。 目录1.引言1.1 背景1.2回…

07MEMS传感器技术 讲座

把同步现象应用于传感器设计。 什么是MEMS? 1.mems芯片是什么意思 MEMS是Micro-Electro-Mechanical System的缩写,中文名称是微机电系统。MEMS芯片简而言之,就是用半导体技术在硅片上制造电子机械系统,再形象一点说就是做一个微…

Vue3——第十一章(内置组件:KeepAlive、Transition、TransitionGroup)

一、KeepAlive <KeepAlive> 是一个内置组件&#xff0c;它的功能是在多个组件间动态切换时缓存被移除的组件实例。 1、基本使用 默认情况下&#xff0c;一个组件实例在被替换掉后会被销毁。这会导致它丢失其中所有已变化的状态——当这个组件再一次被显示时&#xff0…

elementui el-table表格实现翻页和搜索均保持勾选状态(后端分页)

需求&#xff1a;不管是页面切换还是通过搜索获取数据&#xff0c;都要保持已选中的行保持勾选状态&#xff0c;同时将选中行的内容以标签的形式显示出来&#xff0c;当点击关闭标签时可以对应取消选中状态&#xff0c;点击行中的任意位置也可以切换选中状态&#xff0c;单独勾…

柳叶刀重磅:30年来首个基于新机制的降压药,可持续降压近一年

全球范围内高血压患者约有13亿&#xff0c;其中10%的患者&#xff08;超过1亿&#xff09;为难治性高血压&#xff0c;即接受了3种以上不同种类的降压药治疗后&#xff0c;血压仍然控制不佳。长期不受控的高血压可能对心脏和血管均会造成损伤&#xff0c;进而增加患者发生心脏病…