反射的作用

news2025/3/10 10:49:01

  1. 获取一个类里面所有的信息,获取到了之后,再执行其他的业务逻辑

  2. 结合配置文件,动态的创建对象并调用方法

练习1:

image.png

public class MyTest {
    public static void main(String[] args) throws IllegalAccessException, IOException {
        
        Student s = new Student("小A", 23, '女', 167.5, "睡觉");
        Teacher t = new Teacher("播妞", 10000);
        //调用方法
        upload(t);
    }

    private static void upload(Object obj) throws IllegalAccessException, IOException {
        //1创建字节码文件
        Class<?> clazz = obj.getClass();

        //2.创建io流
        BufferedWriter bw = new BufferedWriter(new FileWriter("..\\reflect\\a.txt"));
        //获取所有成员变量
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            //暴力反射:因为成员变量有可能是私有化
            field.setAccessible(true);
            //获取变量名
            String name = field.getName();
            //获取变量在对象中记录的值
            Object value = field.get(obj);
            //写入文件
            bw.write(name + "=" + value);
            bw.newLine();
        }
        bw.close();
    }
}

image.png

练习二:

image.png

//Student
public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void study(){
        System.out.println("学生在学习!");
    }

   //set、get、toString
}
//Teacher
public class Teacher {
    private String name;
    private double salary;

    public Teacher() {
    }

    public Teacher(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }

    public void teach(){
        System.out.println("老师在教书!");
    }

  // set、get、toString
}

//main
public class Test {
    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {


        //1.获取properties文件内的数据
        Properties prop = new Properties();
        FileInputStream fis=new FileInputStream("..\\reflect\\Info.properties");
        prop.load(fis);
        fis.close();
        System.out.println(prop);//{method=study, className=reflectDemo.Student}

        //根据键获取值
        String className = (String) prop.get("className");
        String methodName = (String)prop.get("method");

        //根据全类名获取class文件对象
        Class<?> clazz = Class.forName(className);
        //反射获取构造方法,创建一个对象o
        Constructor<?> constructor = clazz.getDeclaredConstructor();
        Object o = constructor.newInstance();
        //反射获取方法,参数是方法名
        Method method = clazz.getDeclaredMethod(methodName);
        //因为不知道方法是不是私有化,所以暴力反射
        method.setAccessible(true);
        //传入对象运行当前方法
        method.invoke(o);//学生在学习!


    }
}

准备一个info.properties文件,以键值对的形式存储
image.png
以后若要运行其他类里面的方法,在文件内修改数据即可
image.png
将文件修改为如下,再次运行
image.png
在这里插入图片描述

总结:
Snipaste_2024-02-18_16-26-37.png

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

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

相关文章

xstream.mapper和mybatisplus.core.mapper冲突

报错信息 [com.baomidou.mybatisplus.core.mapper.Mapper] conflicts with existing, non-compatible bean definition of same name and class [com.thoughtworks.xstream.mapper.Mapper] 问题描述&#xff1a; 由于一些原因&#xff0c;需要将该SpringBoot的程序&#xff0c…

Android稳定性相关知识

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、相关方法论3.1 crash3.2 性能3.3 高…

el-form validator的校验提示遮盖下边的内容

问题&#xff1a;表单的validator校验&#xff0c;无法自动撑起tip提示的高度&#xff0c;导致遮盖了下边内容 解决方式&#xff1a;将tip提示的样式的定位设置为遵循正常的文档流对象&#xff0c;实现自适应高度。 .el-form-item .el-form-item__content .el-form-item__err…

Linux+Win双系统远程重启到Win

背景 电脑安装了双系统&#xff08;ubuntu 22.04 win11&#xff09;&#xff0c;默认进入ubuntu系统。给电脑设置了WoL(Wake-on-LAN)&#xff0c;方便远程开机远程控制。 但是ubuntu的引导程序grub无法远程控制&#xff0c;远程开机会默认进入ubuntu。 虽然说可以进入ubuntu后…

C#安装CommunityToolkit.Mvvm依赖

这里需要有一定C#基础&#xff0c; 首先找到右边的解决方案&#xff0c;右键依赖项 然后选择nuget管理 这里给大家扩展一下nuget的国内源&#xff08;https://nuget.cdn.azure.cn/v3/index.json&#xff09; 然后搜自己想要的依赖性&#xff0c;比如CommunityToolkit.Mvvm 再点…

Unity数据持久化之PlayerPrefs

PlayerPrefs概述 什么是数据持久化 数据持久化就是将内存中的数据模型转换为存储模型&#xff0c;以及将存储模型转换为内存中的数据模型的统称。即将游戏数据存储到硬盘&#xff0c;硬盘中数据读取到游戏中&#xff0c;也就是传统意义上的存盘。 基本方法 PlayerPrefs是什么…

如何用Qt实现一个无标题栏、半透明、置顶(悬浮)的窗口

在Qt框架中&#xff0c;要实现一个无标题栏、半透明、置顶&#xff08;悬浮&#xff09;的窗口&#xff0c;需要一些特定的设置和技巧。废话不多说&#xff0c;下面我将以DrawClient软件为例&#xff0c;介绍一下实现这种效果的四个要点。 要点一&#xff1a;移除标题栏&#…

⭐北邮复试刷题103. 二叉树的锯齿形层序遍历 (力扣每日一题)

103. 二叉树的锯齿形层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 示例 1&#xff1a;输入&#xff1a…

鱼皮项目_可下载

​ 一、网址 Sign in GitLab 二、登录 以个人邮箱登录 c7 三、下载 四、打开下载文件&#xff0c;后缀zip ​

数据结构-双指针法

介绍 双指针法是一种可以在O&#xff08;n&#xff09;时间复杂度内解决数组、链表、字符串等数据结构相关的问题的方法。核心思想为使用两个指针在不同位置遍历数组或链表&#xff0c;从而实现特定操作。 常见的双指针法有 1.快慢指针&#xff1a;快指针每次移动两步&…

六个好用的Python库,绝对是瑰宝!

在当今的技术浪潮中&#xff0c;Python已经成为了一种广泛应用的编程语言。而要想充分发挥Python的威力&#xff0c;离不开各种优秀的库的支持。这些库能够提供丰富的功能和强大的工具&#xff0c;帮助开发者们更高效地完成各种任务。在本文中&#xff0c;笔者将介绍6个被誉为瑰…

流程编排(LogicFlow)

简介&#xff1a; LogicFlow 是一款流程图编辑框架&#xff0c;提供了一系列流程图交互、编辑所必需的功能和简单灵活的节点自定义、插件等拓展机制&#xff0c;方便我们快速在业务系统内满足类流程图的需求。 vue litefolw实现 liteflow-logicflow-vue实现 特性&#xff1a;…

数据库第四次实验

目录 1.建立数据表并插入数据 2 视图的创建 2.1 行列子集视图的创建 2.2 多表视图 2.3视图上建立视图 2.4分组视图 2.5带表达式的视图 3 删除视图 ​​​​​​​​​​​​​​4 查询视图 ​​​​​​​5 更新视图 5.1 修改某一个属性 5.2 删除一条数据 5.3 插入…

HTTP/1.1 如何优化?

问你一句:「你知道 HTTP/1.1 该如何优化吗?」 我们可以从下面这三种优化思路来优化 HTTP/1.1 协议: 尽量避免发送 HTTP 请求在需要发送 HTTP 请求时&#xff0c;考虑如何减少请求次数减少服务器的 HTTP 响应的数据大小 下面&#xff0c;就针对这三种思路具体看看有哪些优化…

力扣 第 385 场周赛 解题报告 | 珂学家 | 字典树专场

前言 整体评价 这是一场字典树专场&#xff0c;除了t3这个小模拟之外&#xff0c;1&#xff0c;2&#xff0c;4皆可用字典树搞定。 T4感觉做法挺多的&#xff0c;其实&#xff0c;但是字典树应该效率最高的。 T1. 统计前后缀下标对 I 思路: 模拟 O ( n 2 ) O(n^2) O(n2)全遍…

沁恒CH32V30X学习笔记03--64位systick

systick CH32F2x 系列产品Cortex-M3 内核自带了一个 24 位自减型计数器(SysTick timer)。支持 HCLK 或 HCLK/8 作为时基,具有较高优先级别(6)。一般可用于操作系统的时基。 CH32V3x 系列产品内核自带了一个 64 位加减计数器(SysTick),支持 HCLK 或者 HCLK/8 作为时基,…

VQ30 广告点击的高峰期(order by和limit的连用)

代码 select hour(click_time) as click_hour ,count(hour(click_time)) as click_cnt from user_ad_click_time group by click_hour order by click_cnt desc limit 1知识点 order by和limit的连用&#xff0c;取出所需结果 YEAR() 返回统计的年份 MONTH() 返回统计的月份 D…

【C++初阶】deque容器的介绍以及为什么stack和queue选择deque的作为底层容器适配器

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

【C语言】实现栈

目录 &#xff08;一&#xff09;栈 &#xff08;二&#xff09;头文件 &#xff08;三&#xff09;功能实现 &#xff08;1&#xff09;初始化栈 &#xff08;2&#xff09; 栈的销毁 &#xff08;3&#xff09;压栈 &#xff08;4&#xff09; 出栈 &#xff08;5&a…

软件实例分享,乒乓球俱乐部会员系统管理软件教程

软件实例分享&#xff0c;乒乓球俱乐部会员系统管理软件教程 一、前言 以下软件程序教程以 佳易王乒乓球馆计时计费软件V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 多种计费方式&#xff0c;可以按单价&#xff0c;也可以按时间段 可…