访问成员变量(反射)

文章目录

  • 前言
  • 一、访问成员变量的方法
  • 二、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类提供了大量能使我们便捷地实时处理数据的方法,指正和补充的内容欢迎在评论区中留言。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

时间序列新范式!多尺度+时间序列,刷爆多项SOTA

当我们面对复杂模式和多变周期的应用场景&#xff08;比如金融市场分析&#xff09;时&#xff0c;采用多尺度时间序列来做分析和预测是个更好的选择。 这是因为&#xff1a;传统时序方法通常只用固定时间窗口来提取信息&#xff0c;难以适应不同时间尺度上的模式变化。但多尺…

Ezsql(buuctf加固题)

开启环境 SSH连接 第一个为页面地址WEB服务 or 11# 利用万能密码登录 密码可以随便输入或者不输入 这里就可以判断这个题目是让我们加固这个登录页面 防止sql注入 查看index.php 添加以下代码 $username addslashes($username); $password addslashes($password);…

【C++】STL中List的基本功能的模拟实现

前言&#xff1a;在前面学习了STL中list的使用方法&#xff0c;现在我们就进一步的讲解List的一些基本功能的模拟实现&#xff0c;这一讲博主认为是最近比较难的一个地方&#xff0c;各位一起加油。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; …

Unity DOTS技术(九) BufferElement动态缓冲区组件

文章目录 一.简介二.例子 一.简介 在之前的学习中我们发现Entity不能挂载相同的组件的. 当我们需要用相同的组件时则可以使用.IBufferElementData接口 动态缓冲区组件来实现 二.例子 1.创建IBufferElementData组件 using Unity.Entities; using UnityEngine; //[GenerateAu…

C语言基础——函数

ʕ • ᴥ • ʔ づ♡ど &#x1f389; 欢迎点赞支持&#x1f389; 个人主页&#xff1a;励志不掉头发的内向程序员&#xff1b; 专栏主页&#xff1a;C语言基础&#xff1b; 文章目录 前言 一、函数的概念 二、库函数 2.1 库函数和头文件 2.2 库函数的使用/…

10.【机器学习】十大算法之一决策树(Decision tree)算法原理讲解

【机器学习】十大算法之一决策树&#xff08;Decision tree&#xff09;算法原理讲解 一摘要二个人简介三什么是决策树四什么是树4.1 二叉树4.1.1 特殊的二叉树&#xff1a;4.1.2 举例说明 五决策树的优缺点5.1 优点5.2 缺点 六算法原理七信息熵八信息增益九信息增益率十基尼指…

2 - 寻找用户推荐人(高频 SQL 50 题基础版)

2.寻找用户推荐人 考点: sql里面的不等于&#xff0c;不包含null -- null 用数字判断筛选不出来 select name from Customer where referee_id !2 OR referee_id IS NULL;

uniapp中使用百度ocr识别引入项目

uniapp中使用百度ocr识别引入项目 官网申请地址 orcAPI文档地址 1.先获取token const getToken () > {uni.request({url: https://aip.baidubce.com/oauth/2.0/token,method: POST,data: {grant_type: client_credentials,client_id: **, apikeyclient_secret: **, skey…

实现开源可商用的 ChatPDF RAG:密集向量检索(R)+上下文学习(AG)

实现 ChatPDF & RAG&#xff1a;密集向量检索&#xff08;R&#xff09;上下文学习&#xff08;AG&#xff09; RAG 是啥&#xff1f;实现 ChatPDF怎么优化 RAG&#xff1f; RAG 是啥&#xff1f; RAG 是检索增强生成的缩写&#xff0c;是一种结合了信息检索技术与语言生成…

刷代码随想录有感(94):划分字母区间(怪!)

题干&#xff1a; 代码&#xff1a; class Solution { public:vector<int> partitionLabels(string s) {int hash[26] {0};for(int i 0; i < s.size(); i) hash[s[i] - a] i;vector<int> res;int left 0;int right 0;for(int i 0; i < s.size(); i){r…

算法2:滑动窗口(下)

文章目录 水果成篮找到字符串中所有字母异位词串联所有单词的子串*最小覆盖子串* 水果成篮 两元素排空操作 窗口中存在元素交错情况&#xff0c;所以出窗口一定要出干净&#xff01;&#xff01;&#xff01; class Solution { public:int totalFruit(vector<int>& …

AI图书推荐:《如何利用ChatGPT在线赚钱》

这本书《如何利用ChatGPT在线赚钱》&#xff08;$100m ChatGPT_ How To Make Money Online With ChatGPT -- Sharp, Biily -- 2023 &#xff09;主要阐述如何利用ChatGPT这一强大的语言模型工具在互联网上创造收入。 以下是各章节内容的概要&#xff1a; **引言** - 介绍了Chat…

机器学习——多层感知机

感知机 缺点&#xff1a;只能处理线性问题&#xff0c;感知机无法解决异或问题 在这里偏置就像线性模型的常数项&#xff0c;加入偏置模型的表达能力增强&#xff0c;而激活函数就像示性函数&#xff0c;可以模拟神经元的兴奋和抑制&#xff0c;当大于等于0就输出1。 多层感…

从军事角度理解“战略与战术”

战略与战术&#xff0c;均源于军事术语。 战略&#xff08;Strategy&#xff09;&#xff0c;源自希腊语词汇“strategos&#xff08;将军&#xff09;”和“strategia&#xff08;军事指挥部&#xff0c;即将军的办公室和技能&#xff09;”。指的是指挥全局性作战规划的谋略…

网络基础_02

1.ARP协议 地址解析协议&#xff08;Address Resolution Protocol&#xff09; 已知对方的三层ip地址&#xff0c;需要二层mac地址 当一台设备&#xff08;请求方&#xff09;需要知道某个 IP 地址对应的 MAC 地址时&#xff0c;会使用 ARP封装一个数据帧。这台设备的网络层以…

[职场] 为什么不能加薪? #学习方法#知识分享#微信

为什么不能加薪&#xff1f; 不能加薪的根本原因&#xff0c;终于被我找到了&#xff01; 朋友们&#xff01;职场这个地方是个很神奇的世界&#xff0c;有些规则并不是你想象的那样。我们都希望能在这个世界里施展自己的才华&#xff0c;获得升职加薪的荣耀。然而&#xff0c…

Blender 学习笔记(二)游标与原点

1. 游标 游标是界面中的红色圆圈&#xff1a; 1.1 移动游标 我们可以通过点击工具栏中的游标按钮&#xff0c;来移动游标&#xff0c;或者通过快捷键 shift右键 移动。若想要重置复游标位置&#xff0c;可以用 shiftc 恢复&#xff0c;或则通过 shifts 点击 游标->世界原…

Python中的Paramiko与FTP文件夹及文件检测技巧

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; Python代码的魅力与实用价值 在当今数字化时代&#xff0c;编程已成为一种不可或缺的技能。Python作为一种简洁、易读且功能强大的编程语言&#xff0c;受到了全球开发者的喜爱。它不仅适用于初学者入门&#xff0c…

Java 数据库连接(JDBC)的使用,包括连接数据库、执行SQL语句等

一、简介 Java Database Connectivity&#xff08;JDBC&#xff09;是Java应用程序与关系数据库进行交互的一种API。它提供了一组用于访问和操作数据库的标准接口&#xff0c;使开发人员能够使用Java代码执行数据库操作&#xff0c;如查询、插入、更新和删除等。 二、JDBC架构…

C++ AVL树 详细讲解

目录 一、AVL树的概念 二、AVL树的实现 1.AVL树节点的定义 2.AVL树的插入 3.AVL树的旋转 4.AVL树的验证 三、AVL树的性能 四、完结撒❀ 一、AVL树的概念 二叉搜索树虽可以缩短查找的效率&#xff0c;但 如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查 …