Java速成之反射,轻松搞定反射

news2024/11/17 20:47:45

Hello,大家好,我是Feri,一枚十多年的程序员,同时也是一名在读研究生,关注我,且看一个平凡的程序员如何在自我成长,只为各位小伙伴提供编程相关干货知识,希望在自我蜕变的路上,我们一起努力,努力什么时候开始都不晚,我,从现在开始做起!

一、反射

1.1 反射是什么

Java的反射(reflection)机制是运行时获取类的信息(构造函数、属性、方法、注解)。

1.2 反射的作用

1.创建类的对象

2.获取类中的属性,并设置属性的值或者获取属性的值

3.获取类中的方法,可以执行方法(包含私有)

4.获取注解信息

1.3 反射的应用

1.创建类的对象,比如JSON解析,框架中的某些类等

2.获取或设置属性的内容 Field 比如 JSON解析,JDBC封装等

3.执行方法,可以调用Method invoke 代理模式

1.4 反射的演示

全限定类名:类的全称,包含:包名.类名

public static void main(String[] args) {
    //反射 Class 字节码 创建Class对象
    //Class对象的三种创建方式 
    //1.类名.class 2.对象名.getClass() 3.Class.forName("全限定类名")

    //1.创建Class对象
    Class clz=Teacher.class;

    //2.获取类中的公共属性
    Field[] fields1=clz.getFields();//获取类中公共访问修饰符的属性,包含继承

    for(Field f:fields1){
        System.out.println(f.getName());
    }
    System.out.println("---------");

    //3.获取类中的所有属性,不包含继承的
    Field[] fields2=clz.getDeclaredFields();//获取类中的所有属性,不包含父类中的

    for(Field f:fields2){
        System.out.println(f.getName());
    }

    System.out.println("---------");

    //4.获取公共方法
    Method[] methods1=clz.getMethods();//获取类中公共访问修饰符的方法,包含继承

    for(Method m:methods1){
        System.out.println(m.getName());
    }
    System.out.println("**********");

    //5.获取所有方法,不包含父类的
    Method[] methods2=clz.getDeclaredMethods();//获取类中的所有方法,不包含父类中的

    for(Method m:methods2){
        System.out.println(m.getName());
    }

}

1.5 反射总结

1.Class对象创建方式

  • 类名.class
  • 对象名.getClass()
  • Class.forName("全称类名")

2.Class中常用的方法

返回值

方法名

作用

Field[]

getFields

获取类中公共访问修饰符的属性,包含继承

Field[]

getDeclaredFields

获取类中的所有属性,不包含父类中的

Field

getDeclaredField(属性名)

获取类中的指定的属性

Method[]

getMethods

获取类中公共访问修饰符的方法,包含继承

Method[]

getDeclaredMethods

获取类中的所有方法,不包含父类中的

Method

getDeclaredField

获取类中的指定的方法

Object

newInstance

创建类的对象

3.Field的常用方法

getName 获取属性名

setAccessible 设置是否忽略访问修饰符

set() 设置属性的值

4.Method的常用方法

setAccessible 设置是否忽略访问修饰符

invoke 执行方法

1.6 反射实际应用

解析字符串

public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchFieldException {

        String str="name=贝贝&sex=女&info=自恋!";

        //请实现字符串转换为Teacher对象

        //1.解析字符串
        //2.对象创建 属性赋值

        //创建Class对象 -反射
        Class clz=Teacher.class;

        //创建类的对象
        Teacher teacher= (Teacher) clz.newInstance();

        //字符串常用方法 解析字符串 切割& 字符串数组
        String[] strs1=str.split("&");

        System.out.println(Arrays.toString(strs1));

        //循环遍历 键值对
        for(String s1:strs1){
            //切割=
            String[] strs2=s1.split("=");

            System.out.println(Arrays.toString(strs2));

            //反射 获取指定的属性对象

            Field field=clz.getDeclaredField(strs2[0]);

            if(field!=null){
                //设置忽略访问修饰符
                field.setAccessible(true);
                //赋值
                field.set(teacher,strs2[1]);
            }

        }

        System.out.println(teacher);
    }

好啦,今天这篇就打这啦,有任何问题可以随时进行评论交流,如果你有什么想要Feri更新的,请私聊我哈,也可以随时关注,私信我哟,成长的路上,有你们相伴,真是人生一大幸事!

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

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

相关文章

记录一次搭建Nacos集群的问题

Java环境:jdk1.8.0_231 Nacos版本:nacos-server-2.2.0.zip 虽然官方推荐的是3个节点,我们还是使用的是2个节点,首先解压创建nacos_config库,导入nacos/conf目录下的mysql-schema.sql SQL文件,如下表&…

ubuntu双系统分区划分

EFI系统分区(Windows):自Windows 8起,UEFI模式下的BIOS使用该分区。简单来说,它用于存储已安装系统的EFI引导程序。此分区在资源管理器中无法查看,因为它没有驱动器号,但它必须存在,…

【ISAC】通感算一体化

北京邮电大学冯志勇:面向智能交通的通感算一体化网络技术 香港中文大学(深圳)许杰:面向通感算融合的无线资源优化 三者逻辑 感知增强: 多个视角的通信,感知其他视角看不到的通信增强:以前做信道估计都是盲的…

ctfshow-web 萌新题

给她 spring漏洞 pyload: 1.dirsearch扫描&#xff0c;发现git 2. GitHack工具得到.git文件 <?php $passsprintf("and pass%s",addslashes($_GET[pass])); $sqlsprintf("select * from user where name%s $pass",addslashes($_GET[name])); ?>…

01 Solidity--

第一个 Solidity 程序 Solidity 是一种用于编写以太坊虚拟机&#xff08;EVM&#xff09;智能合约的编程语言。 掌握 Solidity 是参与链上项目的必备技能 在 Remix 中&#xff0c;左侧菜单有三个按钮&#xff0c;分别对应文件&#xff08;编写代码&#xff09;、编译&#x…

CUDA编程基础概念

1. CPU和GPU 其中绿色的是计算单元&#xff0c;橙红色的是存储单元&#xff0c;橙黄色的是控制单元。 2. 什么样的任务适合GPU&#xff1f; 计算密集型的程序。易于并行的程序。GPU其实是一种SIMD(Single Instruction Multiple Data)架构。 3. 内存模型以及硬件 Device对应…

QD1-P9 HTML常用标签:超链接(1)

本节学习&#xff1a;HTML 超链接标签&#xff0c;也就是 a 标签。 在前端开发中&#xff0c;<a>​ 标签是超链接&#xff08;anchor&#xff09;标签&#xff0c;用于创建指向其他网页、文件、位置等的链接。 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p9 简单示…

【模板进阶】std::function

一、 s t d : : f u n c t i o n std::function std::function的介绍 s t d : : f u n c t i o n std::function std::function是 C 11 C11 C11引入的一个可调用对象包装器&#xff0c;它可以通过指定模板参数&#xff0c;统一来处理各自可调用对象。 二、实现类似 s t d : …

食家巷小程序:品味平凉美食,领略甘肃风情

甘肃平凉犹如一颗璀璨的明珠&#xff0c;散发着独特的魅力。这里不仅有壮丽的自然风光&#xff0c;更有令人垂涎欲滴的美食。而食家巷小程序&#xff0c;就如同一个神奇的美食宝库&#xff0c;将平凉的美味呈现在你的指尖。 &#x1f4a5;平凉&#xff0c;美食的天堂。 平凉红…

erlang学习:Linux命令学习11

crontab命令 crontab命令是用于管理定时任务的命令行工具。它提供了多种选项和参数&#xff0c;可以用来创建、编辑、查看和删除用户的定时任务。 常用命令 以下是一些常用的crontab命令&#xff1a; crontab -e&#xff1a;编辑当前用户的定时任务列表。该命令会在默认编辑…

高产胜母猪,带你上线我的新项目!

大家好&#xff0c;我是程序员鱼皮。9月&#xff0c;我处于极度爆肝状态&#xff0c;成功完结了最新带大家做的项目 面试刷题平台 。 当我们做完一个项目后&#xff0c;一定要记得把项目上线&#xff0c;这样才算是完成了学习的 “闭环”&#xff0c;写到简历上也才有竞争力。 …

鲁班到家上门安装维修系统源码开发之结构功能解析

随着物联网和智能家居的普及&#xff0c;消费者对便捷、高效的生活方式需求日益增加。鲁班到家作为一款专注于家居安装维修服务的平台&#xff0c;凭借其多渠道预约、智能派单、在线支付与费用明细透明等优势&#xff0c;在市场上赢得了广泛认可。本文将详细解析鲁班到家上门安…

flash-attention代码逻辑

setup.py&#xff1a;python项目中&#xff0c;setup.py用于管理项目的构建、打包和分发过程。这个文件通常包含项目的元数据以及如何构建和安装模块的指令 三个相关命令 构建扩展模块&#xff1a;python setup.py build_ext清理构建文件&#xff1a;python setup.py clean安装…

扩展欧几里得算法 C++

题一 扩展欧几里得算法 解题思路 原链接&#xff1a;https://www.acwing.com/solution/content/1393/&#xff08;下同&#xff09; 代码实现 #include<iostream>using namespace std;void exgcd(int a, int b, int &x, int &y) {if(b 0){x 1, y 0;return ;…

Linux学习/复习5进程间通信

ctrl s 保存到云服务器 ctrl ~ 调用调试

vim插件ctags

ctags简介 ctags&#xff08;Generate tag files for source code&#xff09;是一个用来生成代码标签文件的工具。它可以为多种编程语言的源代码生成标签文件&#xff0c;这些标签文件包含了源代码中的各种元素的信息&#xff0c;如函数名、变量名、类名等。Vim 可以利用这些…

vue中css作用域及深度作用选择器的用法

Vue中有作用域的CSS 当< style>标签有scoped属性时&#xff0c;它的css只作用于当前组建中的元素。vue2和vue3均有此用法&#xff1b; 当使用scoped后&#xff0c;父组件的样式将不会渗透到子组件中。不过一个子组件的根节点会同时受父组件有作用域的css和子组件有作用…

10.9学习

1.数据库和Redis的一致性 全量缓存保证高效读取 所有数据都存储在缓存里&#xff0c;读服务在查询时不会再降级到数据库里&#xff0c;所有的请求都完全依赖缓存。此时&#xff0c;因降级到数据库导致的毛刺问题就解决了。但全量缓存并没有解决更新时的分布式事务问题&#xf…

保姆级教程 | Adobe Illustrator调整颜色透明度

背景 由于课题需要&#xff0c;现需要在Adobe Illustrator里修改部分色块的颜色及透明度 步骤 1. 打开Adobe Illustrator软件&#xff0c;打开或创建一个AI文件&#xff1a; 2. 绘制一个色块&#xff1a; 3. 单击需要调整透明度的对象将其选中 4. 调整颜色的透明度&#xf…

AD中显示Selection includes locked items.Continue?

因为框选拖动组里包含锁定的元器件&#xff0c;所以出现如下提示&#xff1b; 可以单击锁定元器件&#xff0c;点击location的锁形标记即可显示解锁的状态。 解锁之后&#xff1a; 然后就可以拖动框选的元器件了。