Java 反射机制


更多内容,前往IT-BLOG
在这里插入图片描述

反射Reflection被视为动态语言的关键,反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。反射是一种功能强大且复杂的机制。使用它的主要人员是工具构造者,而不是应用程序员。如果仅对设计应用程序感兴趣,而对构造工具不感兴趣,就没有学习的必要。

一、反射机制提供的功能(什么时候会用到反射)

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

二、Class 类

在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识。这个信息跟踪着每个对象所属的类。虚拟机利用运行时类型信息选择相应的方法执行。保存这些信息的类被称为ClassObject类中的getClass()方法将会返回一个Class类型的实例。具体细节说明如下:

public class ReflecTest {public static void main(String[] args) throws Exception {// Class 是带泛型的/*如果一个 Person 对象表示一个特定的人,那么一个 Class 对象将表示一个特定类的属性。*///获取 Class 的方法有三种,第一种如下:Class<Person> clazz = Person.class;//创建 clazz 对应的运行时类 Person 类的对象//创建类的对象:调用Class对象的newInstance()方法:要求是类必须有一个无参的构造器和类的构造器的访问权限需要足够Person person = clazz.newInstance();//也可以先 new 一个对象,通过 getClass 获取 Class对象,从而得知此目标对象的结构Person personTest = new Person();//获取 Class 的方法有三种,第二种如下:Class<? extends Person> personTestClass = personTest.getClass();String clazzName = personTestClass.getName();//com.reflection.learn.PersonSystem.out.printf(clazzName);//获取 Class 的方法有三种,第三种如下:通过Class 的静态方法获取Class<?> className = Class.forName("com.reflection.learn.Person");//通过反射调用运行时类的指定属性Field name = clazz.getField("name");//给属性设置set 时,需要将**对象**和值传入 信息定义 public String name;//获取公有方法name.set(person,"Li Si");//获取私有方法 private int age;Field age = clazz.getDeclaredField("age");age.setAccessible(true);age.set(person,20);//通过反射指定运行的方法(无参)Method display = clazz.getMethod("display");//执行此方法invoke,需要传入对象display.invoke(person);//如果是静态方法,调用规则如下://display.invoke(Person.class);//调用有参方法 public void getObject(String name)Method getObject = clazz.getMethod("getObject", String.class);//方法的执行,需传入对象和参数getObject.invoke(person,"Li Si");}
}

java.lang.Class:是反射的源头:我们创建一个类,通过编译器javac.exe生成对应的.class文件。之后使用java.exe加载(JVM 的类加载器)此.class文件到内存中以后,此文件就是一个运行时类,存在于缓冲区中。这个运行时类本身就是一个Class是实例。且一个运行时类只加载一次。

三、通过反射调用类中指定的方法和属性(重要)

@Test
public void test2() throws Exception{//获取指定的构造器Class<Person> clazz = Person.class;//获取指定构造器Constructor<Person> declaredConstructor = clazz.getDeclaredConstructor(String.class, int.class);Person person = declaredConstructor.newInstance("li", 20);//输出:Person{name='li', age=20}System.out.println(person.toString());//获取指定的方法Method getObject = clazz.getDeclaredMethod("getObject", String.class);getObject.invoke(person,"zhangsan");
}

四、利用反射分析类的能力

java.lang.reflect包中有三个类Field(域)、Method(方法)、Constructor(构造器)。这三个类都有一个叫做 getName方法,用来返回项目的名称。Filed类有一个getType方法,用来返回描述域所属类型的 Class 对象。Method 与 Constructor 类有能够报告参数的方法getParameterTypesMethod类还有一个可以报告返回类型的方法getReturnType()。这三个类还有一个getModifiers方法,返回一个整数值,用不同的位开关描述publicprivate等修饰符。可以通过Modifier类的静态方法将整数转化为public等。Class 类的getDeclareFieldsgetDeclareMethodsgetDeclaredConstructors方法将分别返回类中声明的全部域、方法和构造器,其中包括私有和受保护的成员,但不包括父类成员。

get方法有一个需要解决的问题,name域是一个String时,我们将它当做Object返回没有什么问题。但是假定我们想要查看salary域。它属于double类型,而java中数据值类型不是对象。可以使用Field类中的getDouble方法,也可以调用get方法,此时,反射机制将自动地将这个域值打包到相应的对象包装器中,这里打包成Double

五、应用

【1】JDK 的动态代理:链接
【2】Spring 的 AOP 面向切面编程:链接

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

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

相关文章

登录页设计新选择:毛玻璃和新拟态风格,非2.5D和插画风

登录页给潜在用户传递了产品的品牌调性&#xff0c;是非常重要的一类页面&#xff0c;之前2.5D和插画风格的登录页流行一时&#xff0c;不过这阵风好像过去了&#xff0c;新的风格开始涌现了。 一、越来越流行的毛玻璃设计风格 毛玻璃风格是指将背景模糊处理&#xff0c;使得…

如何在 Linux 上使用 dmesg 命令

文章目录 1. Overview2.ring buffer怎样工作&#xff1f;3.dmesg命令4.移除sudo需求5. 强制彩色输出6.使用人性化的时间戳7.使用dmesg的人性化可读时间戳8.观察实时event9.检索最后10条消息10.搜索特定术语11.使用Log Levels12.使用Facility Categories13.Combining Facility a…

智慧物流之道:数据可视化引领全局监控

在智慧物流的背景下&#xff0c;数据可视化催生了物流管理的全新范式。首先&#xff0c;通过数据可视化&#xff0c;物流企业可以实现对整个供应链的全景式监控。下面我就可以可视化从业者的角度&#xff0c;简单聊聊这个话题。 首先&#xff0c;图表和地图的直观展示使决策者能…

Cyber RT 参数

以共享的方式实现不同节点之间数据交互的通信模式。 参数服务器是基于服务实现的&#xff0c;包含客户端和服务器端&#xff0c;服务端节点可以存储数据&#xff0c;客户端节点可以访问服务端节点操作数据&#xff0c;这个过程虽然基于请求响应的&#xff0c;但是无需自己实现…

linuxlsof详解

lsof 是 List Open File 的缩写, 它主要用来获取被进程打开文件的信息&#xff0c;我们都知道&#xff0c;在Linux中&#xff0c;一切皆文件&#xff0c;lsof命令可以查看所有已经打开了的文件&#xff0c;比如: 普通文件&#xff0c;目录&#xff0c;特殊的块文件&#xff0c;…

el-table 多选表格存在分页,编辑再次操作勾选会丢失原来选中的数据

el-table表格多选时&#xff0c;只需要添加type"selection"&#xff0c; row-key及selection-change&#xff0c;如果存在分页时需要加上reserve-selection&#xff0c;这里就不写具体的实现方法了&#xff0c;可以查看我之前的文章&#xff0c;这篇文章主要说一下存…

使用pytorch实现一个线性回归训练函数

使用sklearn.dataset 的make_regression创建用于线性回归的数据集 def create_dataset():x, y, coef make_regression(n_samples100, noise10, coefTrue, bias14.5, n_features1, random_state0)return torch.tensor(x), torch.tensor(y), coef 加载数据集&#xff0c;并拆分…

shader学习记录——融合、融球效果

融合、融球效果shader&#xff0c;重点在等势面公式上 Shader "Custom/MetaballsShader" {Properties{_MainTex ("Texture", 2D) "white" {}_Color("Color",Color) (1,1,1,1)}SubShader{Tags { "RenderType""Opaque…

什么是光谱共焦位移传感器?揭秘它隐藏的5大优势!

光谱共焦位移传感器是一种先进的传感技术&#xff0c;它利用光学原理来精确测量物体表面的微小位移。这种传感器结合了光谱学和共焦显微术的原理&#xff0c;通过分析反射光的光谱特性来确定物体表面的位置。 光谱共焦传感器的核心部件是光谱仪&#xff0c;它能够将反射光分解成…

【MQL】扩充Comment函数的功能

一、MQL语言中Comment函数的缺陷 Comment函数只能在图表上显示文本信息&#xff0c;无法将信息输出到日志文件或其他位置。Comment函数的文本信息会随着新的新的信息出现而更新&#xff0c;这可能导致就的信息被覆盖。Comment函数的文本信息长度有限&#xff0c;超过一定长度的…

代码随想录算法训练营Day44 | 完全背包理论基础、518.零钱兑换 II、377.组合总和 Ⅳ

完全背包理论基础 完全背包看起来复杂不少&#xff0c;但其代码和0-1背包几乎没啥差别&#xff0c;就只改变了一个背包的遍历顺序&#xff1a; 基于0-1背包的滚动数组实现&#xff0c;将 j 的遍历顺序改为从左到右&#xff08;此时物品会被重复使用&#xff09; 完全背包的重点…

5,水平百叶窗和垂直百叶窗

将宽度设置为若干份&#xff0c;开始显示时若干个起始线&#xff0c;每个起始线间隔相同的距离。显示过程中&#xff0c;每次各个起始线同时向下&#xff08;或向右&#xff09;显示一行&#xff08;或一列&#xff09;图像&#xff0c;直到图像显示完毕。 void CMy1_showbitm…

哪个牌子的电视盒子好用?2024超强电视盒子排名

最近很多朋友问我电视盒子的相关问题&#xff0c;就目前来说&#xff0c;电视盒子的地位依然是不可取代的。我近来要发布的测评内容是哪个牌子的电视盒子好用&#xff0c;耗时两周进行对比后整理了电视盒子排名&#xff0c;看看哪些电视盒子是最值得入手的吧。 NO.1——泰捷新品…

react-组件基础

1.目标 能够使用函数创建组件 能够使用class创建组件 能够给React元素绑定事件 能够使用state和setState() 能够处理事件中的this指向问题 能够使用受控组件方式处理表单 2.目录 React组件介绍 React组件的两种创建方式 React事件处理 有状态组件和无状态组件 组件中的state…

我在代码随想录|写代码Day27 | 贪心算法 | 122.买卖股票的最佳时机 II,55. 跳跃游戏, 45.跳跃游戏 II

&#x1f525;博客介绍&#xff1a; 27dCnc &#x1f3a5;系列专栏&#xff1a; <<数据结构与算法>> << 算法入门>> << C项目>> &#x1f3a5; 当前专栏: <<数据结构与算法>> 专题 : 数据结构帮助小白快速入门算法 &…

【文献管理】zotero插件5——在word中引用参考文献文献样式修改

文章目录 word快速引用参考文献参考文献样式修改GB7714-修改etal word快速引用参考文献 参考文献样式修改 GB7714-修改etal

获取URL中的参数

在现实生活中&#xff0c;我们处处使用URL&#xff0c;但是&#xff0c;对于其中的数据&#xff08;参数&#xff09;&#xff0c;我们该如何获取呢&#xff1f;&#xff1f;这就值得我们深思了&#xff01; 在本文&#xff0c;笔者主要向大家讲解用Java语言的Spring Boot项目…

WEB服务器-Tomcat(黑马学习笔记)

简介 服务器概述 服务器硬件 ● 指的也是计算机&#xff0c;只不过服务器要比我们日常使用的计算机大很多。 服务器&#xff0c;也称伺服器。是提供计算服务的设备。由于服务器需要响应服务请求&#xff0c;并进行处理&#xff0c;因此一般来说服务器应具备承担服务并且保障…

华为OD机试真题-最长子字符串的长度(一)-2023年OD统一考试(C卷)---Python3--开源

题目&#xff1a; 考察内容&#xff1a; 思路转化&#xff1a;求出o字母出现偶次&#xff08;o的索引&#xff09;&#xff1b;环形–双倍字母&#xff1b; 方法1&#xff1a;循环变量双倍字母&#xff08;保证环线&#xff09;&#xff0c;记录最大偶次&#xff0c;如果是&a…

【Flink精讲】Flink单机安装步骤

Flink单机安装步骤 获取Flink安装包&#xff1a;Index of /flink 解压缩&#xff1a;tar -zxvf flink-1.17.2-bin-scala_2.12.tgz 修改配置文件&#xff1a;conf/flink-conf.yaml 启动命令&#xff1a;./bin/start-cluster.sh 终止命令&#xff1a;./bin/stop-cluster.s…