WEB基础---反射
什么是反射
相对官方解释
-
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力;
-
在运行时期,动态地去获取类中的信息(类的信息,方法信息,构造器信息,字段等信息); 在运行的时候获取到的类信息 封装一个字节码对象
反射功能
由于后续均会以代码演示,故此处先行写出后续要用的User类
public class User {private String name;private String password;public User(String name,String password){this.name=name;this.password=password;}public User(){}private User(String name){}public String getName() {return name;}private void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}private void test(String s){System.out.println("这是私有的测试方法,外人无法访问");}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", password='" + password + '\'' +'}';}
}
获取构造方法
public class MyTest {public static void main(String[] args) throws Exception {
// System.out.println(User.class);
// User user=new User();
// System.out.println(user.getClass());Class<?> a=Class.forName("com.WEB.Reflect._02Reflect.User");System.out.println(a);//假定一个非自身类//因为私有属性爆红
// Shoe.class;
// new Shoe().getClass();
// System.out.println("com.WEB.Reflect._02Reflect.Shoe");//获取a当中所有的共有构造Constructor<?> [] constructors=a.getConstructors();//获取所有共有构造System.out.println(constructors);// 获取所有声明了的构造Constructor<?>[] constructors=a.getDeclaredConstructors();//获取所有声明了的构造,私有公有都会出现for (Constructor<?> constructor:constructors){System.out.println(constructor);}}
}
上述的getConstructors()只能获取公共构造,即被public修饰的构造;而getDeclaredConstructors()能够获取所有被声明的构造,即无论公共还是私有,都能够被获取。
让访问权限失效
public class MyTest {public static void main(String[] args) throws Exception {
// System.out.println(User.class);
// User user=new User();
// System.out.println(user.getClass());Class<?> a=Class.forName("com.WEB.Reflect._02Reflect.User");System.out.println(a);//假定一个非自身类//因为私有属性爆红
// Shoe.class;
// new Shoe().getClass();
// System.out.println("com.WEB.Reflect._02Reflect.Shoe");//获取a当中所有的共有构造Constructor<?> [] constructors=a.getConstructors();//获取所有共有构造System.out.println(constructors);// 获取所有声明了的构造
// Constructor<?>[] constructors=a.getDeclaredConstructors();//获取所有声明了的构造,私有公有都会出现
// for (Constructor<?> constructor:constructors){
// System.out.println(constructor);
// }Constructor<?> constructor = a.getConstructor(String.class, String.class);Object o = constructor.newInstance("Lily", "123456");Constructor<?>[] constructor1=a.getDeclaredConstructor(String.class);constructor.setAccessible(true);//破坏访问权限System.out.println(constructor1.newInstance("123"));}
}
重要语句就是constructor.setAccessible(true);设置为true,即可破解访问权限,无论公有还是私有方法均可用。
获得方法
public class MyTest {public static void main(String[] args) throws Exception {
// System.out.println(User.class);
// User user=new User();
// System.out.println(user.getClass());Class<?> a=Class.forName("com.WEB.Reflect._02Reflect.User");System.out.println(a);//假定一个非自身类//因为私有属性爆红
// Shoe.class;
// new Shoe().getClass();
// System.out.println("com.WEB.Reflect._02Reflect.Shoe");//获取a当中所有的共有构造Constructor<?> [] constructors=a.getConstructors();//获取所有共有构造System.out.println(constructors);// 获取所有声明了的构造
// Constructor<?>[] constructors=a.getDeclaredConstructors();//获取所有声明了的构造,私有公有都会出现
// for (Constructor<?> constructor:constructors){
// System.out.println(constructor);
// }Constructor<?> constructor = a.getConstructor(String.class, String.class);Object o = constructor.newInstance("Lily", "123456");
// Constructor<?>[] constructor1=a.getDeclaredConstructor(String.class);
// constructor.setAccessible(true);//破坏访问权限
// System.out.println(constructor1.newInstance("123"));//获取方法Method[] methods =a.getMethods();//获取所有共有方法for (Method method:methods){System.out.println(method);}Method[] methods1=a.getDeclaredMethods();//获取所有方法包括私有for (Method method:methods1){System.out.println(method);}Method method=a.getDeclaredMethod("test", String.class);method.setAccessible(true);//用反射调用方法method.invoke(o,"hello");}
}
同样此处也是通过getMethods()与getDeclaredMethods()
获取字段
public class MyTest {public static void main(String[] args) throws Exception {
// System.out.println(User.class);
// User user=new User();
// System.out.println(user.getClass());Class<?> a=Class.forName("com.WEB.Reflect._02Reflect.User");System.out.println(a);//假定一个非自身类//因为私有属性爆红
// Shoe.class;
// new Shoe().getClass();
// System.out.println("com.WEB.Reflect._02Reflect.Shoe");//获取a当中所有的共有构造Constructor<?> [] constructors=a.getConstructors();//获取所有共有构造System.out.println(constructors);// 获取所有声明了的构造
// Constructor<?>[] constructors=a.getDeclaredConstructors();//获取所有声明了的构造,私有公有都会出现
// for (Constructor<?> constructor:constructors){
// System.out.println(constructor);
// }Constructor<?> constructor = a.getConstructor(String.class, String.class);Object o = constructor.newInstance("Lily", "123456");
// Constructor<?>[] constructor1=a.getDeclaredConstructor(String.class);
// constructor.setAccessible(true);//破坏访问权限
// System.out.println(constructor1.newInstance("123"));//获取方法Method[] methods =a.getMethods();//获取所有共有方法for (Method method:methods){System.out.println(method);}Method[] methods1=a.getDeclaredMethods();//获取所有方法包括私有for (Method method:methods1){System.out.println(method);}Method method=a.getDeclaredMethod("test", String.class);method.setAccessible(true);//用反射调用方法method.invoke(o,"hello");//获取属性
// Field[] fields=a.getDeclaredFields();
// for (Field field:fields){
// System.out.println(field);
// }Field field=a.getDeclaredField("name");field.setAccessible(true);field.set(o,"123");System.out.println(field.get(o));}
}
同样此处也是通过getField()与getDeclaredFields()来获取共有和所有字段。
写在最后:反射是JAVA中很重要的一个机制,后期的SpringBoot,Mybatis均都是用到了反射。笔者小,中,大厂面试均有面试经历,坚持每日分享JAVA全栈知识,希望和大家共同进步。
相关文章:
WEB基础---反射
什么是反射 相对官方解释 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力; 在运行时期,动态地去获取类中的信息(类的信息,方法信息,构造器信息,字段等信息); 在运行的时候获取到的类信息 封装一个字节码对象…...
impdp恢复表后发现比原表多了100多行
因客户删除数据,恢复表时发现恢复表后发现比原表多了100多行,啥原因暂不清楚,继续学习 [oraclehydb ~]$ more expdp_orcl_20240406_2100.log |grep "USR_HY"."T_COPIES". . exported "USR_HY"."T_COPIES…...
Jupyter配置远程访问的密码
安装 下载Anaconda的.sh文件后,上传到服务器,然后进行安装: chmod x anaconda.sh ./anaconda.sh创建虚拟环境 可以指定Python版本创建虚拟环境: conda create --name langchain python3.11.7 conda activate langchain conda …...
Windows下通过MySQL Installer安装MySQL服务
在Windows下,使用MySQL Installer来安装MySQL服务是一个相对简单的过程。以下是一步一步的详细指南: 下载MySQL Installer: 访问MySQL官方网站(https://www.mysql.com/downloads/),在下载页面选择合适的MyS…...
C语言 [力扣]详解环形链表和环形链表II
各位友友们,好久不见呀!又到了我们相遇的时候,每次相遇都是一种缘分。但我更加希望我的文章可以帮助到大家。下面就来具体看看今天所要讲的题目。 文章目录 1.环形链表2.环形链表II 1.环形链表 题目描述:https://leetcode.cn/problems/link…...
Threejs 学习笔记 | 灯光与阴影
文章目录 Threejs 学习笔记 | 灯光与阴影如何让灯光照射在物体上有阴影LightShadow - 阴影类的基类平行光的shadow计算投影属性 - DirectionalLightShadow类平行光的投射相机 聚光灯的shadow计算投影属性- SpotLightShadow类聚光灯的投射相机 平行光 DirectionalLight聚光灯 Sp…...
SSH:安全远程访问的基石
SSH:安全远程访问的基石 一、引言 在当今这个数字化、网络化的时代,远程访问和管理计算机资源已成为日常工作的重要组成部分。然而,如何在不安全的网络环境中确保数据传输的机密性、完整性和可靠性,成为了一个亟待解决的问题。S…...
杰发科技AC7801——ADC之Bandgap和内部温度计算
0. 参考 电流模架构Bandgap设计与仿真 bandgap的理解(内部带隙电压基准) 虽然看不懂这些公式,但是比较重要的一句应该是这个:因为传统带隙基准的输出值为1.2V 1. 使用 参考示例代码。 40002000是falsh控制器寄…...
了解 macOS 中的系统完整性保护 (SIP):开启与关闭
在 macOS 系统中,有一个名为系统完整性保护 (System Integrity Protection,SIP) 的重要功能。SIP 旨在保护系统文件和进程免受未经授权的访问和修改,从而提高系统的安全性和稳定性。然而,在某些情况下,用户可能需要临时…...
【Linux】简易进度条的实现
🎉博主首页: 有趣的中国人 🎉专栏首页: Linux 🎉其它专栏: C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好,本片文章将会讲解Linux中进度条的实现的相关内容。 如果看到最后您觉得这篇文章写得…...
Docker + Django跨域解决方案
什么是Django Django 是一个开源的高级 Python Web 框架,它鼓励快速开发并遵循可重用和可维护的实践。Django 是在 MTV(模型-模板-视图)模式的基础上设计的,这个模式类似于但不同于 MVC(模型-视图-控制器)模…...
Maven 插件使用
1.spring-boot-maven-plugin 我们直接使用 maven package (maven自带的package打包功能),打包Jar包的时候,不会将该项目所依赖的Jar包一起打进去,在使用java -jar命令启动项目时会报错,项目无法正常启动。…...
【HMGD】GD32/STM32 DMA接收不定长串口数据
单片机型号:GD32F303系列 CubeMX配置 配置串口参数 开启DMA 开启中断 示例代码 使用到的变量 uint8_t RX_Buff_FLAG 0; uint8_t RX_Buff[300] {0}; uint8_t TX_Buff[300] {0};串口接收空闲函数 // 串口接收空闲函数 void HAL_UARTEx_RxEventCallback(UART_H…...
局域网手机端远程控制手机
局域网手机端远程控制手机 随着科技的进步和智能设备的普及,远程控制技术在日常生活与工作中的应用越来越广泛。其中,局域网内的手机端远程控制手机技术,因其便捷性和实用性,受到了众多用户的关注。本文将简要介绍该技术及其应用…...
如何在OpenWrt软路由中增加一个新功能
为了在OpenWrt中增加一个新的功能,并使其支持 UCI 配置,我们可以创建一个简单的C语言服务,例如一个简单的日志服务。此服务将记录到日志文件中,并支持通过 UCI 配置启用或禁用日志功能。以下是详细的步骤和代码示例。 1 创建服务…...
【linux】vmtouch文件缓存管理工具
目录 vmtouch简介 用法 例子 统计文件或者目录在缓存中的记录 缓存文件到内存 其他类似工具 vmtouch简介 vmtouch是用c语言编写的文件缓存管理工具,适用用于所有类Unix系统。 作用: 1,查看文件系统缓存情况 2,将文件或目…...
论文阅读:The Unreasonable Ineffectiveness of the Deeper Layers 层剪枝与模型嫁接的“双生花”
作者实证研究了针对流行的开放式预训练 LLM 系列的简单层修剪策略,发现在不同的 QA 基准上,直到去掉一大部分(最多一半)层(Transformer 架构)后,性能的下降才会降到最低。为了修剪这些模型&…...
Python批量备份华为设备配置到FTP服务器
Excel表格存放交换机信息: 备份文件夹效果图: Windows系统配置计划任务定时执行python脚本: Program/script:C:\Python\python.exe Add arguments (optional): D:\Python_PycharmProjects\JunLan_pythonProje…...
Java虚拟机(JVM)中确保资源及时释放的策略
在Java虚拟机(JVM)中,内存管理主要是通过垃圾回收(Garbage Collection, GC)来自动处理的。Java开发者通常不需要(也不应该)显式地释放对象内存,因为JVM的垃圾回收器会自动处理不再使…...
04-Fortran基础--Fortran数组和矩阵运算
04-Fortran基础--Fortran数组和矩阵运算 fortarn中对数组和矩阵的主要操作和内置运算包括: 数组的声明和初始化:fortarn中可以通过声明和初始化来创建数组。例如: integer :: my_array(3) [1, 2, 3] ! 声明一个包含3个整数的数组并初始化数…...
OpenClaw+Qwen3.5-4B-Claude:个人知识库自动化更新方案
OpenClawQwen3.5-4B-Claude:个人知识库自动化更新方案 1. 为什么需要自动化知识管理 作为一个每天需要处理大量技术资料的研究者,我发现自己陷入了一个困境:收藏的文章越来越多,但真正消化吸收的内容却越来越少。上周整理笔记时…...
Unity游戏模组革命:MelonLoader新手10分钟完全指南
Unity游戏模组革命:MelonLoader新手10分钟完全指南 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader 你是否想过为喜爱…...
ncmdump:突破NCM格式限制的音频转换解决方案
ncmdump:突破NCM格式限制的音频转换解决方案 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 问题场景:数字音乐格式的兼容性困境 在流媒体音乐服务普及的今天,网易云音乐采用的NCM加密格式成为了…...
Ostrakon-VL-8B零基础上手:无需Python基础,通过Chainlit界面完成首次图文问答
Ostrakon-VL-8B零基础上手:无需Python基础,通过Chainlit界面完成首次图文问答 你是不是对AI图文对话很感兴趣,但一看到Python代码、命令行就头疼?是不是觉得部署一个多模态大模型需要专业的技术背景?今天我要告诉你一…...
LangChain详解:大模型应用开发框架(通俗理解+专业解析+Python实战)
LangChain详解:大模型应用开发框架(通俗理解专业解析Python实战) 摘要:随着大语言模型(LLM)的普及,单纯调用模型API已无法满足复杂业务需求——如何让大模型“记住”对话历史、“调用”外部工具…...
【紧急预警】FastAPI 2.0升级后AI流式中断率飙升47%?我们逆向分析了32个生产环境trace,定位async_generator内存泄漏根因
第一章:FastAPI 2.0异步AI流式响应对比评测报告 FastAPI 2.0 引入了更精细的异步生命周期控制与原生流式响应增强支持,为大语言模型(LLM)服务的低延迟、高吞吐流式输出提供了坚实基础。本报告聚焦于三种主流AI流式响应模式在 Fast…...
EcomGPT-7B模型蒸馏实践:训练更轻量的小模型服务于高并发场景
EcomGPT-7B模型蒸馏实践:训练更轻量的小模型服务于高并发场景 你是不是也遇到过这样的烦恼?手里有一个像EcomGPT-7B这样的大模型,它在电商场景下回答问题、生成文案的效果确实不错,但一到像“双十一”这样的大促节点,…...
Java线程池中如何用TransmittableThreadLocal避免变量丢失?附完整Demo
Java线程池中TransmittableThreadLocal的实战应用与避坑指南 在Java高并发编程中,线程池是提升性能的利器,但线程复用机制却给上下文传递带来了挑战。当我们在父线程设置变量,子线程却无法获取时,这种"断链"现象常让开发…...
Flash存储、外设操作与系统架构
课程目标与知识体系 课程目的 掌握STM32内部Flash读写操作 熟悉STM32存储器映射 了解malloc动态内存分配 理解STM32启动流程与地址空间知识点体系STM32系统架构 ├── 外设操作(GPIO/USART/DMA) ├── 存储器系统 │ ├── 存储器分类 │ ├── 存储…...
Windows 10/11防火墙设置:如何快速开启ICMP协议实现Ping功能(详细图文)
Windows系统ICMP协议配置全指南:从基础原理到高阶应用 在IT运维和开发工作中,网络连通性测试是最基础却又最频繁的需求之一。想象一下这样的场景:你正在部署一个关键服务,却发现客户端无法连接到服务器;或是远程协助同…...
