当前位置: 首页 > news >正文

WEB基础---反射

什么是反射

相对官方解释

  1. 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力;

  2. 在运行时期,动态地去获取类中的信息(类的信息,方法信息,构造器信息,字段等信息); 在运行的时候获取到的类信息 封装一个字节码对象

反射功能

由于后续均会以代码演示,故此处先行写出后续要用的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年首次提出的&#xff0c;主要是指程序可以访问、检测和修改它本身状态或行为的一种能力; 在运行时期,动态地去获取类中的信息(类的信息,方法信息,构造器信息,字段等信息); 在运行的时候获取到的类信息 封装一个字节码对象…...

impdp恢复表后发现比原表多了100多行

因客户删除数据&#xff0c;恢复表时发现恢复表后发现比原表多了100多行&#xff0c;啥原因暂不清楚&#xff0c;继续学习 [oraclehydb ~]$ more expdp_orcl_20240406_2100.log |grep "USR_HY"."T_COPIES". . exported "USR_HY"."T_COPIES…...

Jupyter配置远程访问的密码

安装 下载Anaconda的.sh文件后&#xff0c;上传到服务器&#xff0c;然后进行安装&#xff1a; chmod x anaconda.sh ./anaconda.sh创建虚拟环境 可以指定Python版本创建虚拟环境&#xff1a; conda create --name langchain python3.11.7 conda activate langchain conda …...

Windows下通过MySQL Installer安装MySQL服务

在Windows下&#xff0c;使用MySQL Installer来安装MySQL服务是一个相对简单的过程。以下是一步一步的详细指南&#xff1a; 下载MySQL Installer&#xff1a; 访问MySQL官方网站&#xff08;https://www.mysql.com/downloads/&#xff09;&#xff0c;在下载页面选择合适的MyS…...

C语言 [力扣]详解环形链表和环形链表II

各位友友们&#xff0c;好久不见呀&#xff01;又到了我们相遇的时候&#xff0c;每次相遇都是一种缘分。但我更加希望我的文章可以帮助到大家。下面就来具体看看今天所要讲的题目。 文章目录 1.环形链表2.环形链表II 1.环形链表 题目描述:https://leetcode.cn/problems/link…...

Threejs 学习笔记 | 灯光与阴影

文章目录 Threejs 学习笔记 | 灯光与阴影如何让灯光照射在物体上有阴影LightShadow - 阴影类的基类平行光的shadow计算投影属性 - DirectionalLightShadow类平行光的投射相机 聚光灯的shadow计算投影属性- SpotLightShadow类聚光灯的投射相机 平行光 DirectionalLight聚光灯 Sp…...

SSH:安全远程访问的基石

SSH&#xff1a;安全远程访问的基石 一、引言 在当今这个数字化、网络化的时代&#xff0c;远程访问和管理计算机资源已成为日常工作的重要组成部分。然而&#xff0c;如何在不安全的网络环境中确保数据传输的机密性、完整性和可靠性&#xff0c;成为了一个亟待解决的问题。S…...

杰发科技AC7801——ADC之Bandgap和内部温度计算

0. 参考 电流模架构Bandgap设计与仿真 bandgap的理解&#xff08;内部带隙电压基准&#xff09; ​ ​ 虽然看不懂这些公式&#xff0c;但是比较重要的一句应该是这个&#xff1a;因为传统带隙基准的输出值为1.2V ​ 1. 使用 参考示例代码。 40002000是falsh控制器寄…...

了解 macOS 中的系统完整性保护 (SIP):开启与关闭

在 macOS 系统中&#xff0c;有一个名为系统完整性保护 (System Integrity Protection&#xff0c;SIP) 的重要功能。SIP 旨在保护系统文件和进程免受未经授权的访问和修改&#xff0c;从而提高系统的安全性和稳定性。然而&#xff0c;在某些情况下&#xff0c;用户可能需要临时…...

【Linux】简易进度条的实现

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; Linux &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解Linux中进度条的实现的相关内容。 如果看到最后您觉得这篇文章写得…...

Docker + Django跨域解决方案

什么是Django Django 是一个开源的高级 Python Web 框架&#xff0c;它鼓励快速开发并遵循可重用和可维护的实践。Django 是在 MTV&#xff08;模型-模板-视图&#xff09;模式的基础上设计的&#xff0c;这个模式类似于但不同于 MVC&#xff08;模型-视图-控制器&#xff09;模…...

Maven 插件使用

1.spring-boot-maven-plugin 我们直接使用 maven package &#xff08;maven自带的package打包功能&#xff09;&#xff0c;打包Jar包的时候&#xff0c;不会将该项目所依赖的Jar包一起打进去&#xff0c;在使用java -jar命令启动项目时会报错&#xff0c;项目无法正常启动。…...

【HMGD】GD32/STM32 DMA接收不定长串口数据

单片机型号&#xff1a;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…...

局域网手机端远程控制手机

局域网手机端远程控制手机 随着科技的进步和智能设备的普及&#xff0c;远程控制技术在日常生活与工作中的应用越来越广泛。其中&#xff0c;局域网内的手机端远程控制手机技术&#xff0c;因其便捷性和实用性&#xff0c;受到了众多用户的关注。本文将简要介绍该技术及其应用…...

如何在OpenWrt软路由中增加一个新功能

为了在OpenWrt中增加一个新的功能&#xff0c;并使其支持 UCI 配置&#xff0c;我们可以创建一个简单的C语言服务&#xff0c;例如一个简单的日志服务。此服务将记录到日志文件中&#xff0c;并支持通过 UCI 配置启用或禁用日志功能。以下是详细的步骤和代码示例。 1 创建服务…...

【linux】vmtouch文件缓存管理工具

目录 vmtouch简介 用法 例子 统计文件或者目录在缓存中的记录 缓存文件到内存 其他类似工具 vmtouch简介 vmtouch是用c语言编写的文件缓存管理工具&#xff0c;适用用于所有类Unix系统。 作用&#xff1a; 1&#xff0c;查看文件系统缓存情况 2&#xff0c;将文件或目…...

论文阅读:The Unreasonable Ineffectiveness of the Deeper Layers 层剪枝与模型嫁接的“双生花”

作者实证研究了针对流行的开放式预训练 LLM 系列的简单层修剪策略&#xff0c;发现在不同的 QA 基准上&#xff0c;直到去掉一大部分&#xff08;最多一半&#xff09;层&#xff08;Transformer 架构&#xff09;后&#xff0c;性能的下降才会降到最低。为了修剪这些模型&…...

Python批量备份华为设备配置到FTP服务器

Excel表格存放交换机信息&#xff1a; 备份文件夹效果图&#xff1a; Windows系统配置计划任务定时执行python脚本&#xff1a; Program/script&#xff1a;C:\Python\python.exe Add arguments (optional)&#xff1a; D:\Python_PycharmProjects\JunLan_pythonProje…...

Java虚拟机(JVM)中确保资源及时释放的策略

在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;内存管理主要是通过垃圾回收&#xff08;Garbage Collection, GC&#xff09;来自动处理的。Java开发者通常不需要&#xff08;也不应该&#xff09;显式地释放对象内存&#xff0c;因为JVM的垃圾回收器会自动处理不再使…...

04-Fortran基础--Fortran数组和矩阵运算

04-Fortran基础--Fortran数组和矩阵运算 fortarn中对数组和矩阵的主要操作和内置运算包括&#xff1a; 数组的声明和初始化&#xff1a;fortarn中可以通过声明和初始化来创建数组。例如&#xff1a; integer :: my_array(3) [1, 2, 3] ! 声明一个包含3个整数的数组并初始化数…...

el-select选项框内容过长

利用popper-class实现选项框内容过长&#xff0c;截取显示功能&#xff1a; <el-select popper-class"popper-class" :popper-append-to-body"false" v-model"value" placeholder"请选择"><el-optionv-for"item in opt…...

K8S面试题学习5

参考K8S面试题&#xff08;史上最全 持续更新&#xff09;_kubernetes常见面试题-CSDN博客做的个人总结&#xff0c;规划是每天看10题&#xff0c;thx&#xff01; 1. 请详述kube-proxy原理? 每个node节点都会运行一个kube-proxy的进程&#xff0c;核心功能是将service的访问…...

字符以及字符串函数

字符以及字符串函数 求字符串长度strlen 长度不受限制的字符串函数strcpystrcatstrcmp 长度受限制的字符串函数strncpystrncatstrncmp 字符串查找strstrstrtok 错误信息报告strerror 字符分类函数字符转换函数tolowertoupper 内存操作函数memcpymemmovememcmpmemset 这篇文章注…...

记录解决问题--redis ssl连接

1.问题场景 springboot连接redis启动报错&#xff0c;感觉是没连上redis&#xff0c;本地是正常启动的&#xff0c;但是本地不是ssl连接。 2.redis ssl连接知识 ①一般不开启ssl的连接&#xff0c;直接连接即可&#xff0c;有密码输密码。 ②不受信的ssl连接&#xff0c;也就…...

买卖股票的最佳时机

dp[i][0] 表示第i天持有股票所得最多现金&#xff0c;相当于买的价格最低&#xff0c;卖的价格最高 持有股票状态为0&#xff0c;不持有为1 用二维数组表示天数和是否持有&#xff0c; i-1天就持有&#xff0c;或者第i天买入 class Solution {public int maxProfit(int[] p…...

Linux部署安装

Linux部署安装 Linux中有两种软件安装包 一、源码包 软件的源代码是软件的原始数据&#xff0c;但是源代码不能直接在计算机中直接运行安装。 需要通过编译将源代码转换为计算机可以识别的机器语言&#xff0c;之后才可以进行安装。 源码包安装的方式可以在安装过程中发根据…...

docker搭建mysql集群实现主从复制

前言 随着业务的增长&#xff0c;一台数据服务器已经满足不了需求了&#xff0c;负载过重。这个时候就需要减压了&#xff0c;实现负载均衡和读写分离&#xff0c;一主一丛或一主多从。 主服务器只负责写&#xff0c;而从服务器只负责读&#xff0c;从而提高了效率减轻压力。 …...

Neo4j 之安装和 CQL 基本命令学习

正常使用结构化的查询语言 SQL&#xff08;Structured Query Language&#xff09;较多一些&#xff0c;但是像 Neo4j 这种非结构化的图形数据库来说&#xff0c;就不得不学习下 CQL&#xff08;Cypher Query Language&#xff09;语言了。如果你之前学过 《离散数学》或《图论…...

【全开源】JAVA台球助教台球教练多端系统源码支持微信小程序+微信公众号+H5+APP

功能介绍 球厅端&#xff1a;球厅认证、教练人数、教练的位置记录、助教申请、我的项目、签到记录、我的钱包、数据统计 教练端&#xff1a;我的页面&#xff0c;数据统计、订单详情、保证金、实名认证、服务管理、紧急求助、签到功能 用户端&#xff1a;精准分类、我的助教…...

机器学习-如何为模型选择评估指标?

为机器学习模型选择评估指标是一个关键步骤&#xff0c;因为它直接关联到如何衡量模型的性能。以下是选择评估指标的一些建议&#xff1a; 1、理解问题类型&#xff1a; 分类问题&#xff1a;对于二分类问题&#xff0c;常见的评估指标包括准确率、精确率、召回率、F1分数、R…...