Java SE:反射

反射作用

获取字节码文件里面的所有信息,包括构造方法、成员、成员方法,以及修饰他们的修饰符、类型和方法的返回值等等,只要是类里面的内容都能获取,获取之后可以动态的调用方法,动态的创建对象

获取类字节码文件对象

通过该对象可进行获取构造方法、成员、成员方法等操作 

 //获取Class对象的三种方法

        //方法一:通过调用Class类里面的静态方法获取(包名 + 类名)
        Class<?> class1 = Class.forName("a01CreatReflect.Student");
        System.out.println(class1);

        //方法二:通过字节码文件获取
        Class<Student> class2 = Student.class;
        System.out.println(class2);

        //方法三:通过类实例化后通过实列化对象获取Class
        Student student = new Student();
        Class<? extends Student> class3 = student.getClass();
        System.out.println(class3);

 获取构造方法 

declare可以获取到所有(包括私有)的构造方法,而没有declare修饰的只能获取公共的 

 获取成员

 

declare可以获取到所有(包括私有)的成员,而没有declare修饰的只能获取公共的  

获取成员方法 

 

declare修饰的将获取该类的所有方法(包括权限不够大的方法) 

 

没有declare修饰的连该类继承的父类,以及实现的接口的公共方法都能获取到 

 应用场景

 获取一个实例化对象的所有信息,并将他存进文件

 public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, IOException {
        //练习1:获取字节码文件里面的成员信息并保存进文件
        Student s = new Student("zhangsan", 19, "睡觉");
        Teacher t = new Teacher("niubi", 26);

        //获取字节码文件对象
        saveObj(s);
    }

    public static void saveObj(Object o) throws ClassNotFoundException, IllegalAccessException, IOException {
        //获取当前对象的字节码文件对象
        Class<?> aClass = o.getClass();
        //创建高级字符输出流对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("Reflect\\a.txt"));
        //字符串对象

        //通过字节码文件对象获取该字节码里面的所有成员变量并保存进文件
        Field[] fields = aClass.getDeclaredFields();
        for (Field field : fields) {
            StringBuilder sb = new StringBuilder();
            field.setAccessible(true);
            //获取成员变量的名字
            String name = field.getName();
            //获取成员变量的值
            Object value = field.get(o);
            StringBuilder append = sb.append(name + "=" + value);
            bw.write(append.toString());
            bw.newLine();
        }
        bw.close();
    }

 无需修改源码,实现调用不同类的方法

 public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //练习2:不用修改代码,只需修改配置文件实现运行其他类的方法

        //反射:从文件中获取内容进行操作
        Properties p = new Properties();
        //把文件内容全部加载进集合p
        p.load(new InputStreamReader(new FileInputStream("Reflect\\a.txt")));
        System.out.println(p);

        //获取配置文件中的类名和方法名
        String method = p.getProperty("method");
        String classname = p.getProperty("Classname");
        System.out.println(method);
        System.out.println(classname);

        //创建字节码文件对象
        Class aClass = Class.forName(classname);
        //通过字节码文件创建对象
        //1.获取空参构造
        Constructor con = aClass.getDeclaredConstructor();
        //暴力反射:临时将构造方法的权限扩至最大
        con.setAccessible(true);
        //2.通过空参构造创建该类对象
        Object o = con.newInstance();
        //3.该对象调用方法(获取要调用的方法)
        Method m = aClass.getDeclaredMethod(method);
        //暴力反射:临时将方法的权限扩至最大
        m.setAccessible(true);
        m.invoke(o);
    }

 动态代理

当一个项目已经上线运营时,而需求发生变化,需要新功能,若直接修改源码(侵入式修改)需要重新测试,发布新版本等等操作很老告, 而动态代理的可以省去一堆繁琐的步骤

动态代理步骤:创建代理对象,代理对象调用要代理的方法

 

 

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

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

相关文章

vue3中的基本语法

目录 基础素材 vue3的优化 使用CompositionAPI理由 1. reactive() 函数 2. ref() 函数 2.1. ref的使用 2.2. 在 reactive 对象中访问 ref 创建的响应式数据 3. isRef() 函数 4. toRefs() 函数 5. computed() 5.1. 通过 set()、get()方法创建一个可读可写的计算属性 …

“耳机党”注意了!你的耳机,用对了吗?

文章目录 &#x1f4d6; 介绍 &#x1f4d6;&#x1f3e1; 什么是“3个60”原则&#xff1f; &#x1f3e1;&#x1f4d2; 如何遵循“3个60”原则&#xff1f; &#x1f4d2;&#x1f4dd; 控制音量&#x1f4dd; 适时休息&#x1f4dd; 关注外界声音 &#x1f4d6; 介绍 &…

深度学习目标检测】二十二、基于深度学习的肺炎检测系统-含数据集、GUI和源码(python,yolov8)

肺炎尽管很常见&#xff0c;但准确诊断是一项困难的任务。它要求训练有素的专家对胸部X光片进行检查&#xff0c;并通过临床病史&#xff0c;生命体征和实验室检查进行确认。肺炎通常表现为胸部X光片上一个或多个区域的阴影(opacity)增加。但是&#xff0c;由于肺部有许多其他状…

足球青训俱乐部|基于Springboot的足球青训俱乐部管理系统设计与实现(源码+数据库+文档)

足球青训俱乐部管理系统目录 目录 基于Springboot的足球青训俱乐部管理系统设计与实现 一、前言 二、系统设计 1、系统架构设计 三、系统功能设计 1、管理员登录界面 2、公告信息管理界面 3、学员管理界面 4、商品信息管理界面 5、课程安排管理界面 四、数据库设计…

机器学习:主成分分析笔记

主成分分析&#xff08;Principal Component Analysis&#xff0c;PCA&#xff09;是一种无监督的机器学习算法&#xff0c;通常用于高维数据的降维、提取主要特征、数据降噪和可视化。PCA的基本思想是将原始数据的多个变量转换为少数几个相互独立的变量&#xff08;即主成分&a…

上海亚商投顾:深成指震荡涨超1% 两市成交连续破万亿

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指3月1日震荡反弹&#xff0c;深成指、创业板指午后涨超1%。充电桩概念股集体走强&#xff0c;英可瑞、欧陆…

Stable Video文本生成视频公测地址——Scaling Latent Video Diffusion Models to Large Datasets

近期&#xff0c;Stability AI发布了首个开放视频模型——"Stable Video"&#xff0c;该创新工具能够将文本和图像输入转化为生动的场景&#xff0c;将概念转换成动态影像&#xff0c;生成出电影级别的作品&#xff0c;旨在满足广泛的视频应用需求&#xff0c;包括媒…

leetcode10正则表达式匹配

leetcode10正则表达式匹配 思路python 思路 难点1 如何理解特殊字符 ’ * ’ 的作用&#xff1f; 如何正确的利用特殊字符 ’ . ’ 和 ’ * ’ &#xff1f; * 匹配零个或多个前面的那一个元素 "a*" 可表示的字符为不同数目的 a&#xff0c;包括&#xff1a; "…

二维码门楼牌管理系统技术服务:制作详解

文章目录 前言一、二维码门楼牌制作技术要求二、二维码门楼牌管理系统的优势与应用 前言 随着信息化时代的到来&#xff0c;二维码技术已广泛应用于各个领域。在城市管理中&#xff0c;二维码门楼牌管理系统的应用为城市管理带来了极大的便利。本文将详细探讨二维码门楼牌管理…

绝地求生:【2024PGC之路——PUBG电竞积分分布】

亲爱的PUBG电竞爱好者&#xff0c; 你们好&#xff01; 2024年PUBG电竞即将开始&#xff0c;让我们一起深入了解下今年令人激动的PGS 和 PGC赛事积分分配情况。 PUBG GLOBAL SERIES&#xff08;PGS全球系列赛&#xff09;: 积分分布 根据我们之前概述的《PUBG 2024电竞计划》…

camunda7数据库schame和表结构介绍

本文基于Camunda7.19.0版本&#xff0c;介绍Camunda开源工作流引擎的数据库架构和ER模型&#xff0c;Camunda7.19.0共49张表&#xff0c;包括了BPMN流程引擎、DMN规则引擎、CMMN引擎、历史数据、用户身份等方面的表结构定义&#xff0c;以及表与表之间的关联关系。 1、camunda…

SQL优化——插入数据、主键优化、order by 优化、group by 优化、limit 优化、count优化、update优化、

目录 1、SQL优化1——插入数据&#xff08;Insert&#xff09; 1.1、普通插入&#xff1a; 1.1.1、采用批量插入&#xff08;一次插入的数据不建议超过1000条&#xff09; 1.1.2、手动提交事务 1.1.3、主键顺序插入 1.2、大批量插入 1.2.1、在客户端连接服务器的时候&am…

Python——桌面摄像头软件(附源码+打包)

目录 一、前言 二、桌面摄像头软件 2.1、下载项目 2.2、功能介绍 三、打包工具&#xff08;nuitka&#xff09; 四、项目文件复制&#xff08;我全部合到一个文件里面了&#xff09; 五、结语 一、前言 看见b站的向军大叔用electron制作了一个桌面摄像头软件 但是&#x…

【离散化】【 树状树状 】100246 将元素分配到两个数组中

本文涉及知识点 离散化 树状树状 LeetCode 100246 将元素分配到两个数组中 给你一个下标从 1 开始、长度为 n 的整数数组 nums 。 现定义函数 greaterCount &#xff0c;使得 greaterCount(arr, val) 返回数组 arr 中 严格大于 val 的元素数量。 你需要使用 n 次操作&#x…

Network LSA 结构简述

Network LSA主要用于描述一个区域内的网络拓扑结构&#xff0c;包括网络中的路由器和连接到这些路由器的网络。它记录了每个路由器的邻居关系、连接状态以及连接的度量值&#xff08;如带宽、延迟等&#xff09;&#xff0c;以便计算最短路径和构建路由表。display ospf lsdb n…

CentOS下安装Kafka3

kafka是分布式消息队列&#xff0c;本文讲述其在centos&#xff08;centos 7.5&#xff09;下的安装。安装过程可以参考其官方文档https://kafka.apache.org/36/documentation.html 首先在官网 https://kafka.apache.org/downloads 下载Kafka二进制文件&#xff08;官网的压缩包…

WordPress免费的远程图片本地化下载插件nicen-localize-image

nicen-localize-image&#xff08;可在wordpress插件市场搜索下载&#xff09;&#xff0c;是一款用于本地化文章外部图片的插件&#xff0c;支持如下功能&#xff1a; 文章发布前通过编辑器插件本地化 文章手动发布时自动本地化 文章定时发布时自动本地化 针对已发布的文章…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于条件风险价值的虚拟电厂参与能量及备用市场的双层随机优化》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 这篇文章的标题涉及到以下几个关键点…

数字革命的浪潮:Web3如何改变一切

随着数字技术的不断发展&#xff0c;人类社会正迎来一场前所未有的数字革命浪潮。在这个浪潮中&#xff0c;Web3技术以其去中心化、安全、透明的特性&#xff0c;正在逐渐改变着我们的生活方式、商业模式以及社会结构。本文将深入探讨Web3技术如何改变一切&#xff0c;以及其所…

【学习心得】请求参数加密的原理与逆向思路

一、什么是请求参数加密&#xff1f; 请求参数加密是JS逆向反爬手段中的一种。它是指客户端&#xff08;浏览器&#xff09;执行JS代码&#xff0c;生成相应的加密参数。并带着加密后的参数请求服务器&#xff0c;得到正常的数据。 常见的被加密的请求参数sign 它的原理和过程图…