java反射教程

news2024/11/24 19:45:04

 

反射(Reflection)是 Java中的一种机制,它是一种特殊的面向对象编程技术。在 Java中,反射可以分为静态反射和动态反射两种。静态反射是指在 Java程序运行时才进行的一种反射,它可以保证程序运行时不会出现内存泄漏等错误。下面将从静态和动态两个方面来进行介绍。首先介绍静态反射,接着介绍动态反射,最后通过实例来具体分析一下静态和动态的区别。 1.静态类型:定义在源文件中,不会随类的实例化而改变 2.动态类型:可以通过运行时动态加载和更新

  • 1.静态反射

    静态反射就是在 Java程序运行时才进行的一种反射,其主要工作原理如下: 在类加载时,应用程序就会生成一个 Class对象,这个 Class对象的属性和方法都是从源文件中继承来的。当应用程序对某个类进行调用时, Java解释器会从源文件中读取 Class对象的信息,然后在运行时对该类进行一次反射调用,从而使被调用的类恢复到以前的静态状态。整个过程非常简单,因此称之为静态反射。 在 Java中,如果类没有实例化,就会通过静态类型来表示该类的属性和方法。下面举个例子来说明一下静态类型是如何工作的: 这段代码首先定义了一个对象X,然后定义了一个对象Y。现在我们需要根据X和Y来创建一个新的对象T。为了创建T,我们必须使用类的 Class对象中提供的 Class接口。在类加载时,如果类没有实例化,那么就会先从源文件中读取 Class对象并将其实例化,然后再用类的 Class接口来访问这一对象。如果类没有实例化,那么在类加载时就会直接使用当前类中的属性和方法来创建T。 使用类加载时进行反射调用可以使应用程序中生成了一个新的类对象T。为了使这个T能够被运行时解析并加载到内存中,应用程序首先要获取一个 Class对象并将其实例化,然后再利用其属性和方法来调用T。 从上面的代码可以看出,静态类型是通过类加载时进行反射调用来生成的。由于动态类型是通过运行时动态加载和更新来实现的,因此当动态类型被调用时会与静态类型有一定差别: 通过上面两张图片可以看出两者在创建对象时都没有实例化,因此它们在创建对象时都是静态类型。

  • 2.动态反射

    动态反射是指在程序运行时,动态加载、动态更新对象的属性和方法,以满足程序中各种特殊需求。 1.通过反射实现加载 动态反射需要调用 Class. write ()方法来加载对象,具体过程如下: (1)创建一个对象实例,并且使用 this. pid= new Program (" myFuel"," length"," number"," arguments"); 2.更新 动态反射加载完成后,会在程序的运行阶段调用 Class. write ()方法来更新对象的属性和方法。注意,代码中可能会出现以下几种情况: 这是因为类中没有提供类的静态信息,如果类没有实现静态信息,就无法加载类中的属性和方法。 因为 Class. write ()方法需要在运行阶段才能加载所有的属性和方法。

  • 3.静态和动态的区别

    静态和动态都可以控制对象的类型,但是它们所能控制的内容不同。静态类型能够控制对象的类型,但是对象在运行时是不能改变它的类型的。当类被实例化时,对象的静态属性和方法都会被赋值给类的实例,并且继承了该对象对应的静态属性和方法。类被实例化后,这些属性和方法都会被删除,但是它们仍在运行时存在。 因此,在程序运行时如果需要获取这些属性和方法,就必须在程序运行时对其进行加载和更新。 如果类中需要添加新的属性和方法,并且不想使其对象被实例化时将其删除,可以使用动态类型。当需要将一个类进行实例化后再删除其对应的静态属性和方法时,可以使用动态类型。 例如:假设我们有一个名为 ArraySet的类,它的静态属性是 arraySet. setTimeout ()。在调用 ArraySet. setTimeout ()方法时会抛出一个异常:“OutOfMemoryError”,问题在于对象未被实例化时 ArraySet是无法被调用的。如果我们在程序运行时把对象进行实例化并将其属性和方法都添加到对应的静态属性和方法上,那么就可以在程序运行时对其进行加载和更新了。

  • 4.实例分析

    下面我们通过一个例子来分析一下静态反射和动态反射的区别: 上面例子中,我们定义了一个名为java.la ng. Class. Double的类,并在该类定义了一个 Class对象。在编译时, Java应用程序并没有对这个类进行任何修改,只是将其声明为 Class对象,并且将其实例化了。当类在运行时, Java应用程序会动态加载这个 Class对象并在类中定义一个新的变量来定义它。

  • 常用的java反射代码如下

  • 1. 获取类对象
    ```
    Class clazz = Class.forName("com.example.demo.User");
    ```
    2. 获取类的构造方法
    ```
    Constructor constructor = clazz.getConstructor(String.class, int.class);
    ```
    3. 创建对象
    ```
    Object obj = constructor.newInstance("Tom", 18);
    ```
    4. 获取类的属性
    ```
    Field field = clazz.getDeclaredField("name");
    ```
    5. 设置属性值
    ```
    field.setAccessible(true);
    field.set(obj, "Jerry");
    ```
    6. 获取类的方法
    ```
    Method method = clazz.getDeclaredMethod("sayHello");
    ```
    7. 调用方法
    ```
    method.invoke(obj);
    ```

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

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

相关文章

数据分析的作用和意义?

数据分析的作用和意义?在当下数字化转型发展的大环境中,数据也成为企业商业成功与否的重要基础,如何利用好数据分析问题预测未来也成为更多企业面临的首要问题。而随时大数据的不断渗透,数据量和数据类型也越来越多,数…

asp.net车辆管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net车辆管理系统 是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使用c#语言开发 asp.net车辆管理系统VS开发sqlserver数…

【CSIG图像图形技术挑战赛-开放世界目标检测竞赛】火热报名中!

竞赛名称:开放世界目标检测竞赛/Few Shot)主办方: 中国图象图形学学会(CSIG)合作方: 360集团竞赛目的与意义:目标检测是计算机视觉中的核心任务之一,主要目的是让计算机可以自动识别图片中目标的类别&#…

Windows File Recovery使用教程

Windows File Recovery简介 Windows File Recovery是微软在2020年发布的命令提示符文件恢复工具,它不仅具有高成功率和高安全性,还适用于不同的文件系统和文件丢失场景。如果你需要从本地硬盘、USB设备、SD卡等设备中恢复意外丢失或删除的JPEG、PDF、…

分析Spring事务管理原理及应用

目录 一、Spring事务管理介绍 (一)基本理论 (二)实际工作中的举例 (三)简单应用举例 二、Spring事务配置介绍 (一)Spring事务属性介绍 传播属性(传播行为&#xff…

车身控制模块BCM(Body Control Module)

1.BCM概述 车身控制模块BCM是高集成度的芯片。BCM的英文全称是Body Control Module。其控制对象是采用高灵敏度带唤醒及睡眠检测的高频收发器,实现车门车窗遥控上锁与开锁、电动后视镜、中控门锁、玻璃升降装置、车灯(远光灯、近光灯、位置灯、制动灯、转向灯、雾灯…

【RocketMQ】主从模式下的消费进度管理

在【RocketMQ】消息的拉取一文中可知,消费者在启动的时候,会创建消息拉取API对象PullAPIWrapper,调用pullKernelImpl方法向Broker发送拉取消息的请求,那么在主从模式下消费者是如何选择向哪个Broker发送拉取请求的? 进…

【Linux】项目自动化构建工具-make/Makefile

文章目录1.make/Makefile的重要性2.规则及使用使用规则3.Makefile编译多文件1.make/Makefile的重要性 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中&#xf…

2023美赛春季赛Z题模型代码

已经完成模型代码,仅供大家参考,需要更多请看文末 一、问题分析 首先需要收集与奥运会举办城市/国家相关的历史数据。这需要涉及诸如经济、土地利用、人类满意度(包括运动员和观众)、旅行、基础设施建设、环境影响等多个方面。数…

(二)【软件设计师】计算机系统—CPU运算器控制器

文章目录一、CPU1.计算机硬件基本组成(了解)2.中央处理单元(了解)3.CPU组成4.例题二、运算器1.运算器有两个主要功能2.简要介绍运算器中各组成部件的功能三、控制器1.例题2.组成部分四、总结一、CPU 1.计算机硬件基本组成&#x…

让chatGPT当我的老师如何? 通过和chatGPT交互式学习,了解在ES中,一条JSON数据是如何写到磁盘上的

最近一直有一个问题,如鲠在喉。争取早一天解决,早一天踏踏实实的睡觉。 问题是:在ES中,一条JSON数据是如何写入到磁盘上的? 如何解决这个问题?我想到了chatGPT,还有lucene的学习资料。这篇文章&…

港科夜闻|香港科大(广州)创邻图数据联合实验室正式成立

关注并星标每周阅读港科夜闻建立新视野 开启新思维1、香港科大(广州)创邻图数据联合实验室正式成立。未来,香港科大(广州)与「创邻科技」双方将围绕万亿级大图神经网络计算框架、海量数据的时序图处理、分布式原生图数据库事务及性能优化等前沿图技术领域研究展开深…

Cocos Creator的Hello World

0、文档 Cocos官网文档 1、下载 访问cocos官网下载Cocos Dashboard 安装时选项安装 Visual Studio 2017可以不勾选 注意:Cocos Dashboard的快捷方式文件名为CocosDashboard.exe,不要误认为是安装文件 2、注册、登录 注册/登录cocos网址 3、Cocos D…

深度学习之CD数据集创建

深度学习之数据集创建1. 原始文件相关文件路径2. 数据集创建2.1 数据格式一2.2 数据格式二1. 原始文件相关文件路径 原始路径 对于label图片文件,通道需要为单通道,如果不是单通道,训练数据会报错 报错信息例如:ValueError: Mask…

自然语言处理(八):Lexical Semantics

目录 1. Sentiment Analysis 2. Lexical Database 2.1 What is Lexical Database 2.2 Definitions 2.3 Meaning Through Dictionary 2.4 WordNet 2.5 Synsets 2.6 Hypernymy Chain 3. Word Similarity 3.1 Word Similarity with Paths 3.2 超越路径长度 3.3 Abstra…

波形失真总结

失真是输入信号与输出信号在幅度比例关系、相位关系及波形形状产生变化的现象。音频功放的失真分为电失真和声失真两大类。电失真是由电路引起的,声失真是由还音器件扬声器引起的。电失真的类型有:谐波失真、互调失真、瞬态失真。声失真主要是交流接口失…

idea使用之 单词拼写检查设置 分级管理

前言 idea的智能提示使用起来非常顺手, 拼接检查也是其中一项, 有些字段什么的, 不小心将单词的字母顺序写错了, idea的拼接检查就会提示(前提是字段命名规范,并且乱序之后的不再是一个具有意义的单词), 如此一来, 就能规避很多粗心大意的错误. 但是呢, 有些时候,项目中有些自…

用Claude和Stable Diffusion绘制《武松打虎》

绘制四大名著的经典画面 现在最火爆的AI,分为两类,一个是文本生成,一个是图片生成。如果让这两种结合到一起来,会是什么样的效果的。 这样是不是可能帮我们绘制很多场景下的图片,比如四大名著,帮我们的四…

Numpy基础用法

Numpy 【Numerical Python】是一个开源的Python科学计算库,用于快速处理任意维度的数组。Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用Python要简洁的多。Numpy使用ndarray对象来处理多维数组,该对象是一个快…

【项目分析】基于工艺融合的数控编程方法的设计与实现

系列综述: 💞目的:本系列是个人整理为了秋招项目的,按照面试常问及项目核心点整理 🥰来源:该项目源于数控系统迭代的实验项目 🤭结语:如果有帮到你的地方,就点个赞和关注…