访问成员变量(反射)

news2025/2/23 3:17:12

文章目录

  • 前言
  • 一、访问成员变量的方法
  • 二、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)){//判断该成员变量的类型是否为int
                            System.out.println("使用setInt()方法修改成员变量");
                            field[i].setInt(demo, 20);
                    
                        }else if(fieldType.equals(String.class)){//判断该成员变量类型是否为String
                            System.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.coloradmin.cn/o/1799804.html

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

相关文章

虚拟机与windows文件同步

如果上图中不能设置&#xff0c;则在虚拟机mnt文件夹执行以下命令&#xff1a;

【Vue】作用域插槽

插槽分类 默认插槽&#xff1a;组件内定制一处结构 具名插槽&#xff1a;组件内定制多处结构 插槽只有两种&#xff0c;作用域插槽不属于插槽的一种分类。作用域插槽只是插槽的一个传参语法 作用&#xff1a; 定义slot 插槽的同时, 是可以传值的。给 插槽 上可以 绑定数据&a…

FL Studio21.2.9中文破解版水果软件安装包附带激活码注册码

音乐制作软件&#xff0c;对很多人而言&#xff0c;是一个“高门槛”的存在。它既需要专业的音乐知识&#xff0c;也需要复杂的操作技巧。 「FL Studio 21中文版马丁版下载」&#xff0c;复制整段内容&#xff0c;打开最新版「夸克APP」即可获取链接&#xff1a; https://pan…

Qt QProcess调用外部程序,并实时打印输出信息

Qt QProcess调用外部程序&#xff0c;并实时打印输出信息 引言一、源码分析1. 外部程序 - 被QProcess调用启动2. QProcessDemo - 调用外部程序&#xff0c;并实时打印输出信息 二、参考链接 引言 QProcess是Qt框架中的一个类&#xff0c;用于处理外部进程。它提供了一种直接与操…

RabbitMQ docker安装及使用

1. docker安装RabbitMQ docker下载及配置环境 docker pull rabbitmq:management # 创建用于挂载的目录 mkdir -p /home/docker/rabbitmq/{data,conf,log} # 创建完成之后要对所创建文件授权权限&#xff0c;都设置成777 否则在启动容器的时候容易失败 chmod -R 777 /home/doc…

CorelDRAW2024发布更新啦!设计师们的得力助手

在数字化的今天&#xff0c;视觉设计已经成为我们生活中不可或缺的一部分。从手机界面到广告海报&#xff0c;从网页布局到包装设计&#xff0c;每一个细节都离不开设计师们的专业与创意。然而&#xff0c;面对日益增长的设计需求和不断提升的审美标准&#xff0c;许多设计师开…

贝锐花生壳DDNS:远程访问数据库,仅需简单3步

在当今数字化时代&#xff0c;数据的远程访问和管理变得至关重要。无论是企业还是个人开发者&#xff0c;都需要一种简单、安全的方式来远程访问和管理本地部署的数据库&#xff0c;如MySQL、PostgreSQL、MongoDB等。贝锐花生壳DDNS服务提供了一个完美的解决方案&#xff0c;通…

【Vue】组件的存放目录问题

注意&#xff1a; .vue文件 本质无区别 组件分类 .vue文件分为2类&#xff0c;都是 .vue文件&#xff08;本质无区别&#xff09; 页面组件 &#xff08;配置路由规则时使用的组件&#xff09;复用组件&#xff08;多个组件中都使用到的组件&#xff09; 存放目录 分类开来的…

fastjson 泛型转换问题(详解)

系列文章目录 附属文章一&#xff1a;fastjson TypeReference 泛型类型&#xff08;详解&#xff09; 文章目录 系列文章目录前言一、代码演示1. 不存在泛型转换2. 存在泛型转换3. 存在泛型集合转换 二、原因分析三、解决方案1. 方案1&#xff1a;重新执行泛型的 json 转换2. …

Java使用GDAL来解析KMZ及KML实战

目录 前言 一、在GQIS中浏览数据 1、关于空间参考 2、属性表格 二、GDAL的相关驱动及解析实战 1、GDAL中的KMZ驱动 2、GDAL实际解析 三、数据解析成果 1、KML解析结果 2、KMZ文件入库 四、总结 前言 在前面的博客中讲过纯Java实现Google地图的KMZ和KML文件的解析&…

java第二十一课 —— 快捷键,包,访问修饰符

IDEA 快捷键 删除行&#xff1a;Ctrl Y复制行&#xff1a;Ctrl D补全代码&#xff1a;Alt /添加取消注释&#xff1a;Ctrl /导入该行需要的类&#xff1a;Alt Enter快速格式化代码&#xff1a;Ctrl Shift L快速运行程序&#xff1a;Ctrl Shift F10生成构造器&#xf…

Python实现调用并执行Linux系统命令

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 &#x1f913; 同时欢迎大家关注其他专栏&#xff0c;我将分享Web前后端开发、人工智能、机器学习、深…

Oracle数据库设计规范指南(Word原件)

方便业务功能实现、业务功能扩展&#xff1b;方便设计开发、增强系统的稳定性和可维护性&#xff1b;保证数据完整性和准确性&#xff1b;提高数据存储效率&#xff0c;在满足业务需求的前提下&#xff0c;使时间开销和空间开销达到优化平衡。资料获取&#xff1a;本文本个人名…

tmux工具使用鼠标滚动窗口及分屏命令

tmux工具使用鼠标滚动窗口及分屏命令 1. tmux source配置文件 长期生效2. 临时生效3. 实现分屏 1. tmux source配置文件 长期生效 vim ~/.tmux.conf echo "set -g mouse on" > ~/.tmux.conf tmux source-file ~/.tmux.conf2. 临时生效 1. 进入到tmux命令窗口 2.…

【echarts】如何制作,横坐标每个日期点如何对应一条竖线的图,以及 markline设置后不生效问题

图的样式如下&#xff1a; 在线演示 每一个日期&#xff0c;对应一条竖线展示。 echarts配置内容&#xff1a; 在线演示 option {xAxis: {type: category,data: [20240601, 20240602, 20240603, 20240604, 20240605, 20240606, 20240607] // X轴数据},yAxis: {type: valu…

【Postman接口测试】第四节.Postman接口测试项目实战(中)

文章目录 前言五、Postman断言 5.1 Postman断言介绍 5.2 响应状态码断言 5.3 包含指定字符串断言 5.4 JSON数据断言六、参数化 5.1 Postman参数化介绍 5.2 Postman参数化实现 5.3 针对项目登录接口参数化实现 总结 前言 五、Postman断言 5.1 Postman断言介…

m3u8视频怎么打开?教你三招!

m3u8 是一种文本文件格式&#xff0c;用于创建媒体播放列表&#xff0c;现在大部分的视频流媒体都是m3u8格式。当我们从网上下载下来m3u8文件的时候会发现&#xff0c;它本身不是一段视频&#xff0c;而是一个索引纯文本文件。想要正常打开播放m3u8视频其实也很简单&#xff0c…

javaWeb4 Maven

Maven-管理和构建java项目的工具 基于POM的概念 1.依赖管理&#xff1a;管理项目依赖的jar包 &#xff0c;避免版本冲突 2.统一项目结构&#xff1a;比如统一eclipse IDEA等开发工具 3.项目构建&#xff1a;标准跨平台的自动化项目构建方式。有标准构建流程&#xff0c;能快速…

jvm学习笔记(三) ----- 垃圾回收器

这里写目录标题 1.单线程/串行收集器2.多线程回收器-吞吐量优先3. 多线程回收器-响应时间优先4.G1收集器5.GC参数 链接: jvm学习笔记(一) ----- JAVA 内存 链接: jvm学习笔记(二) ----- 垃圾回收 JVM垃圾回收性能有以下两个主要的指标: 吞吐量 &#xff1a;工作时间&#xff08…

牛客小白月赛95

vp&#xff0c;为后面的比赛做准备 A.相遇 #include <iostream> #include <vector> #include <algorithm> #include <set> #include <unordered_map> #include <cstring> #include <cstdio> #include <string> #include <…