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-32B生成的Python代码自动测试
OpenClaw跨平台脚本:Qwen3-32B生成的Python代码自动测试 1. 为什么需要AI全流程编程辅助 作为经常需要写脚本处理数据的开发者,我发现自己陷入了一个典型困境:每天要花大量时间编写重复性代码,而真正需要创造性思考的部分反而被…...
Copilot 命令行使用方式介绍(npm)
1. 什么是 Apache SeaTunnel? Apache SeaTunnel 是一个非常易于使用、高性能、支持实时流式和离线批处理的海量数据集成平台。它的目标是解决常见的数据集成问题,如数据源多样性、同步场景复杂性以及资源消耗高的问题。 核心特性 丰富的数据源支持&#…...
如何评价目前主流的AI论文生成软件?哪一款最好用?
目前主流 AI 论文工具已形成清晰的中文全流程、英文国际、文献 / 润色专项三大阵营,PaperRed、毕业之家是中文论文全流程首选,ChatGPT-4o、Claude 3.7适合英文与深度逻辑,Kimi、Elicit专攻文献处理。没有绝对 “最好”,只有最适配…...
OpenClaw+百川2-13B自动化数据分析:Excel报告生成与可视化
OpenClaw百川2-13B自动化数据分析:Excel报告生成与可视化 1. 为什么需要自动化数据分析工具 上周我接手了一个市场调研项目,需要分析来自5个渠道的销售数据。当我第三次因为手工复制粘贴数据出错而不得不重做报表时,突然意识到:…...
如何高效解决Calibre中文路径翻译问题:完整实用指南
如何高效解决Calibre中文路径翻译问题:完整实用指南 【免费下载链接】calibre-do-not-translate-my-path Switch my calibre library from ascii path to plain Unicode path. 将我的书库从拼音目录切换至非纯英文(中文)命名 项目地址: htt…...
GTE中文文本嵌入模型部署案例:中小企业文档去重降本提效
GTE中文文本嵌入模型部署案例:中小企业文档去重降本提效 1. 项目背景与价值 中小企业日常运营中会产生大量文档资料,包括合同文件、产品说明、客户沟通记录、内部报告等。这些文档往往存在重复内容,导致存储空间浪费、信息检索困难、管理成…...
Claude Code子代理开发手册:如何打造专属AI编程助手(含MCP服务器对接技巧)
Claude Code子代理开发手册:如何打造专属AI编程助手(含MCP服务器对接技巧) 在当今快节奏的软件开发环境中,团队开发者越来越需要能够适应特定工作流程的智能辅助工具。Claude Code作为新一代AI编程助手平台,其子代理(…...
Youtu-VL-4B-Instruct多模态模型部署教程:预防磁盘空间不足的5个实用技巧
Youtu-VL-4B-Instruct多模态模型部署教程:预防磁盘空间不足的5个实用技巧 1. 引言:多模态模型部署的磁盘挑战 部署大型多模态模型时,磁盘空间管理往往是第一个需要面对的挑战。Youtu-VL-4B-Instruct作为腾讯优图实验室开发的视觉语言模型&a…...
YOLO12新手入门:40MB轻量模型,低配置也能流畅运行
YOLO12新手入门:40MB轻量模型,低配置也能流畅运行 1. YOLO12简介与核心优势 1.1 什么是YOLO12 YOLO12是2025年最新发布的目标检测模型,由美国纽约州立大学布法罗分校和中国科学院大学联合研发。这个模型最大的特点是引入了革命性的注意力为…...
