访问成员变量(反射)

文章目录

  • 前言
  • 一、访问成员变量的方法
  • 二、Field类
    • 1.常用方法
    • 2.实操展示
  • 总结

前言

        为了实现随时随地调用某个类的某个成员变量,我们可以通过反射的Field类进行调用。这其中需要我们获取该类的Class对象,再调用Field类的相关方法,实时地灵活地调用或改变成员变量。记得添加try-catch语句并且是java.lang包下的方法。


一、获取成员变量的方法

        Field类型的对象是指以成员变量为对象的变量。在我们获取该成员变量时,根据需要指定Field类型对象是否为数组。

获取成员变量的方法
方法功能描述
getFields()获取该类的所有公有的成员变量
getField(String name)获取指定的该类中的公开的成员变量(name字符串决定)
getDeciaredFields()获取该类的所有成员变量
getDeclaredField(String name)获取指定的该类的成员变量

        实操展示:将Demo类实例化,再转化为Class类对象,Field对象通过以上方法获取其中的成员属性。

Class Demo{public int id="101";private String name="王五";
}Demo demo = new Demo();
Class class = demo.getClass;Field f1[] = class.getFields();
//获取Demo类的所有的公有的成员变量Field f2 = class.getDeclaredField("name");
//获取Demo类中私有成员属性"name"

二、Field类

1.常用方法

         以下时Field类的常用方法:

Field类的常用方法
方法功能描述
getName()获得该成员变量的名称
getType()获得表示该成员变量类型的Class对象
get(Object obj)获得指定对象obj中成员变量的值,返回值为Object型
set(Object obj,Object value) 将指定的obj类中的成员变量的值设置为value
getInt(Object obj)获得指定类中类型为int的成员变量的值
setInt(Object obj,int i)将指定的obj类中的int类型的成员变量的值设置为value
getFloat(Object obj)获得指定对象obj类中类型为float的成员变量的值
setFloat(Object obj,Float f)将指定对象obj中类型为float的成员变量的值设置为f
getBoolean(Object obj)获得指定对象obj中类型为boolean的成员变量的值
setBoolean(Object obj,boolean z)j将指定对象obj中类型为boolean的成员变量的值设置为z
setAccessible(boolean falg)设置为true时忽略private修饰符私有权限,直接访问成员变量
getModifiers()获得可以解析出该成员变量所采用修饰符的整数值

        注意:以上方法大部分需要写在try-catch语句中,具体看问题报错。 

2.实操展示

        实例:创建一个Demo类,在其中创建各种成员变量;创建一个See类,使用上述方法获取Demo类成员变量的详细信息;创建Use类,使用上述方法获取成员变量数值,或者改变其值。

        Demo类:

public class Demo {public String name;public int age;private int id;  //私有}

        See类:

import java.lang.reflect.*;
public class See {public static void main(String[] args) {Demo demo = new Demo();Class class1=demo.getClass();try {Field field[] = class1.getDeclaredFields(); //获取Demo的Class类所有成员变量属性for(int i=0;i<field.length;i++){System.out.println("成员变量的名称:"+field[i].getName());System.out.println("成员变量的类型:"+field[i].getType());System.out.println("成员变量的修饰符权限"+Modifier.toString(field[i].getModifiers()));System.out.println("------------------------------");}} catch (Exception e) {e.printStackTrace();}}
}

        运行结果:

        

        通过getDeciaredFields()方法将Demo类成员变量转化为Field类对象,使用Field类常用方法即可在该类main方法中获取到Demo类成员方法的详细情况。

        Use类:

import java.lang.reflect.*;
public class Use {public static void main(String[] args) {Demo demo = new Demo();Class class1 = demo.getClass();Field field[] = class1.getDeclaredFields();for(int i=0;i<field.length;i++){try {System.out.println("输出"+field[i].getName()+"成员变量原本的值:"+field[i].get(demo));Class fieldType = field[i].getType();   //Field类常用方法System.out.println("数据类型:"+fieldType);if(fieldType.equals(int.class)){//判断该成员变量的类型是否为intSystem.out.println("使用setInt()方法修改成员变量");field[i].setInt(demo, 20);}else if(fieldType.equals(String.class)){//判断该成员变量类型是否为StringSystem.out.println("使用set()方法修改成员变量");field[i].set(demo,"王五");}System.out.println("修改后的值为:"+field[i].get(demo));System.out.println("-------------------------------------");} catch (Exception e) {System.out.println("try-catch捕捉到异常,使用setAccessible()方法更改成员变量权限");field[i].setAccessible(true);try {System.out.println("输出"+field[i].getName()+"成员变量原本的值:"+field[i].get(demo));System.out.println("使用setInt()方法修改成员变量");field[i].setInt(demo, 101); //将私有权限的成员变量修改数值System.out.println("修改后的值为:"+field[i].get(demo));} catch (Exception e2) {e2.printStackTrace();}}}}}

        运行结果:

 

        通过使用Field类的常用方法get()和set(),实时地获取和修改该类对象的成员变量的值。 


总结

        以上就是今天要讲的内容,本文仅仅简单介绍了访问成员变量的使用,而Field类提供了大量能使我们便捷地实时处理数据的方法,指正和补充的内容欢迎在评论区中留言。

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

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

相关文章

mysql 元数据锁(MDL)

因为当我们对数据库表进行操作时&#xff0c;会自动给这个表加上 MDL 对一张表进行 CRUD 操作时&#xff0c;加的是MDL 读锁&#xff1b;对一张表做结构变更操作的时候&#xff0c;加的是 MDL 写锁&#xff1b; MDL 是为了保证当用户对表执行 CRUD 操作时&#xff0c;防止其他…

618什么数码好物值得入手?优质数码清单分享,错过等明年!

在到来的618年中大促&#xff0c;各种数码好物竞相亮相&#xff0c;正是您更新装备、升级体验的黄金时刻&#xff0c;在这个购物的狂欢节里&#xff0c;我们特别为大家准备了一份精选的优质数码清单&#xff0c;帮助大家从海量的选择中筛选出真正值得入手的宝贝&#xff0c;这些…

Wireshark抓包日常运维实用过滤

0x0 Wireshark 介绍 Wireshark 是一款功能强大的网络分析工具&#xff0c;适用于网络专业人员。它提供了出色的过滤器&#xff0c;您可以轻松放大到您认为可能存在问题的位置。过滤器的主要好处是消除定位流量&#xff0c;并缩小要查找的数据类型。 0x1 根据源 IP 地址过滤主…

探秘Facebook:社交媒体的未来之路

Facebook&#xff0c;作为全球最大的社交媒体平台之一&#xff0c;一直处于数字社交革命的前沿。然而&#xff0c;随着科技和社会的不断发展&#xff0c;Facebook正面临着新的挑战和机遇。本文将探索Facebook的未来之路&#xff0c;揭示社交媒体的新趋势和发展方向。 1. 深度社…

恢复误删和格式化的文件的利器

一、简介 1、一款由Piriform开发的免费文件恢复工具,它能够帮助用户恢复那些不小心从电脑上删除的文件,包括从回收站清空的文件,以及因用户错误操作而从存储设备中删除的图片、音乐、文档等多种格式的文件。Recuva支持对硬盘、闪存卡、U盘等多种存储介质进行扫描与恢复,并且…

Codeforces Round 951 (Div. 2) F. Kostyanych‘s Theorem(思维题 交互好题)

题目 交互题&#xff0c;n&#xff08;n<1e5&#xff09;个点的完全图&#xff0c;无向的&#xff0c;初始恰好删了n-2条边 每次询问可以输入一个d&#xff1a;? d 交互器会输出一个当前度>d的点v&#xff0c; 如果有多个这样的点&#xff0c;输出度最小的&#xff…

DALL-E 2: 重新定义图像生成的人工智能

前言 随着人工智能技术的迅猛发展&#xff0c;图像生成已经成为AI研究领域中的一个重要方向。OpenAI推出的DALL-E 2无疑是其中的佼佼者。这一强大的生成模型能够根据文本描述生成高质量的图像&#xff0c;为创意工作者和各行各业的专业人士提供了全新的工具。本文将深入探讨DA…

Python和C++赋值共享内存、Python函数传址传值、一些其他的遇到的bug

1、Numpy共享内存的情况&#xff1a; array1 np.array([1, 2, 3]) array2 array1 array2[0] 0 # array1也会跟着改变&#xff0c;就地操作 array2 array2 * 2 # array2不会跟着改变&#xff0c;属于非就地操作&#xff0c;会创建一个新的地址给array2array2 array1…

1+x(Java)中级题库易混淆理论题(三)

SQL 语句中进行 group by 分组时&#xff0c;可以不写 where 子句 分组时可以多层分组&#xff0c;比如&#xff1a;先按照省、再按照市来分组。 File 类不能获取文件的内容 在使用 select 语句进行查询分组时&#xff0c;如果希望去掉不满足条件的分组&#xff0c;使用 hav…

C#中实现订单30分钟自动取消的策略

在电子商务或在线预订系统中&#xff0c;订单超时自动取消是一个常见的需求。这种机制可以确保那些长时间未支付的订单不会一直占用系统资源&#xff0c;从而提高系统的效率和可靠性。本文将介绍如何在C#中实现一个订单在30分钟内未支付则自动取消的策略。 一、需求分析 首先…

【前端】JS示例:判断Array()类型的数组里是否存在指定的值,不存在就追加进去

在jQuery中&#xff0c;虽然jQuery主要用于操作DOM和提供丰富的JavaScript库&#xff0c;但它并没有专门用于数组操作的特定函数。然而&#xff0c;你可以使用原生的JavaScript数组方法来检查数组中是否存在某个值&#xff0c;并在不存在时将其添加到数组中。 以下是一个简单的…

高考加油,奥利给

又到了一年一度的高考时刻了啊&#xff0c;高考是漫漫人生路上的一个转折点&#xff0c;祝各位莘莘学子都超常发挥、金榜题名

阿贝云免费虚拟主机和免费云服务器评测

阿贝云是一家提供免费虚拟主机和免费云服务器的云服务提供商。他们的服务非常受用户欢迎&#xff0c;因为他们提供的免费方案相比其他竞争对手来说更具竞争力。用户可以在阿贝云上轻松创建自己的网站&#xff0c;并享受稳定可靠的服务。阿贝云的免费虚拟主机套餐包括免费的域名…

人类语言处理nlp部分笔记——二、BERT和它的家族-介绍和微调

参考自李宏毅课程-人类语言处理 二、BERT和它的家族-介绍和微调 1. What is pre-train model 这里所说的pre-train model是输入一串tokens&#xff0c;能够输出一串vectors&#xff0c;且每个vector可以表示对应的语义的模型&#xff0c;这些vectors也被称作为embeddings。以…

笔记-python爬虫之xpath的基本使用

一、简介 XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。XPath 是 W3C XSLT 标准的主要元素&#xff0c;并且 XQuery 和 XPointer 都构建于 XPath 表达之上。 参照 二、安装 1 pip3 install lxml三、使用 1、导入 1 from lx…

【set】集合总结

一、Set Set集合是Collection的子接口,代表一种集合,此种集合是元素不重复. 有两个常用实现类 HashSet 是元素不重复,无序,主要是指遍历顺序和插入顺序不一致 TreeSet 是元素不重复,排序 LinkedHashSet不常用 二、HashSet 1.1 介绍 HashSet是Set的实现类 底层是由哈希表实…

微信小程序上线后获取定位失效

描述 微信小程序在开发过程中&#xff0c;不论是模拟器还是真机调试都能正常正常获取定位信息 但是上线后异常 解决 ​ 我这里以uniapp开发举例 manifest.json文件中 >> 微信小程序模块 >> 微信小程序权限配置 >> 勾选位置接口&#xff0c;描述必填&#x…

Python数据分析I

目录 注&#xff1a;简单起见&#xff0c;下文中"df"均写为"表名"&#xff0c;"函数"均写为"HS"&#xff0c;"属性"均写为"SX"&#xff0c;"范围"均写为"FW"。 1.数据分析常用开源库 注释…

在Linux环境中通过Docker运行swift

直接在Linux环境安装 swift 编译环境太难了&#xff0c;总是会遇到各种各样的问题。发现swift可以用docker安装后&#xff0c;分分钟就搞定了&#xff0c;太棒了。 1. 拉取 swift 镜像 docker pull swift:latest2. Linux本地创建程序目录 容器里面创建的文件都是临时的&…

安卓手机平板使用JuiceSSH无公网IP远程连接本地服务器详细流程

文章目录 前言1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 前言 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? 本文就和大家分享一下如何使用 cpolarJuiceSSH 实现手机端远程连接Linux…