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

【韩顺平老师Java反射笔记】

反射

文章目录

  • 基本使用
  • 反射机制
    • java程序在计算机有三个阶段
    • 反射相关的主要类
  • 反射调用优化
  • Class类的常用方法
  • 获取Class对象的6种方式
  • 哪些类型有Class对象
  • 类加载
    • 类加载时机
    • 类加载过程图
  • 通过反射获取类的结构信息
    • 第一组:java.lang.Class类
    • 第二组:java.lang.reflect.Filed类
    • 第三组:java.lang.reflect.Method类
    • 第四组:java.lang.reflect.Constructor类
  • 通过反射创建对象
  • 通过反射访问类中的成员

基本使用

Properties prop = new Properties();
prop.load(new FileInputStream("src\\re.properties"));String classfullpath = prop.getProperty("classfullpath").toString();
String method = prop.getProperty("method").toString();
System.out.println("classfullpath = " + classfullpath);
System.out.println("method = " + method);// 加载类,返回Class类型的对象cls
Class cls = Class.forName(classfullpath);
// 通过 cls 得到你加载的类 com.hspedu.Cat 的对象实例
Object obj = cls.newInstance();
System.out.println("o的运行类型=" + obj.getClass());
// 通过cls得到你加载的类 com.hspedu.Cat 的 methodName "hi" 的对象方法
// 即: 在反射中,可以把方法视为对象(万物皆对象)
Method method1 = cls.getMethod(method);
// 通过method1 调用方法:即通过方法对象实现调用方法
method1.invoke(obj); // 传统方法 对象.方法(),反射机制 方法.invoke(对象)

反射机制

1.反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息(化比如成员变量,构造器,成员方法等等),并能操作对象的属性及方法。反射在设计模式和框架底层都会用到

2.加载完类之后,在堆中就产生了一个Class类型的对象(一个类只有一个Class对象),
这个对象包含了类的完整结构信息。通过这个对象得到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,形象的称之为:反射

java程序在计算机有三个阶段

image-20241130164420581

反射相关的主要类

1.java.lang.Class:代表一个类,Class对象表示某个类加载后在堆中的对像
2.java.lang.reflect.Method:代表类的方法
3.java.lang.reflect…Field:代表类的成损变量
4.java.lang.reflect…Constructor::代表类的构造方法
这些类在java.lang.reflection

image-20241130153056489 image-20241130153310208 image-20241130160958148

反射调用优化

.setAccessible(true); // 关闭访问检查, 大约提升30%速度

Class类的常用方法

image-20241130163925403

获取Class对象的6种方式

1.编译阶段

Class.forName()

应用场景:多用于配置文件,读取类全路径,加载类.

2.加载阶段

类.class

应用场景:多用于参数传递,比如通过反射得到对应构造器对象

3.Runtime运行阶段

对象.getClass()

4.通过类加载器得到一个Class对象

image-20241130174005576

5.基本数据(int,char,boolean,float,double,byte,long,short)按如下方式得到Class类对象

image-20241130174202007

6.基本数据类型对应的包装类,可以通过.type得到Class类对像

image-20241130174252269

哪些类型有Class对象

如下类型有Class对象

1.外部类,成员内部类,静态内部类,局部内部类,匿名内部类
2.interface:接口
3.数组
4.enum:枚举
5.annotation: 注解
6.基本数据类型
7.void

image-20241130203135505

类加载

静态加载:编译时加载相关的类,如果没有则报错,依赖性太强

动态加载:运行时加载需要的类,如果运行时不用该类,即使不存在该类,则不报错,降低了依赖性

image-20241130205230059

类加载时机

1.当创建对象时(new) // 静态加载
2.当子类被加载时,父类也加载 // 静态加载
3.调用类中的静态成员时 // 静态加载
4.通过反射 // 动态加载

类加载过程图

image-20241130210726219 image-20241130211558478

image-20241201152730969

通过反射获取类的结构信息

第一组:java.lang.Class类

1.getName:获取全类名
2.getSimpleName:获取简单类名
3.getFields:获取所有public修饰的属性,包含本类以及父类的
4.getDeclaredFields:获取本类中所有属性
5.getMethods:获取所有public修饰的方法,包含本类以及父类的
6.getDeclaredMethods:获取本类中所有方法
7.getConstructors::获取本类所有public修饰的构造器
8.getDeclaredConstructors获取本类中所有构造器
9.getPackage:以Package形式返回包信息
10.getSuperClass:以Class形式返回父类信息
11.getInterfaces:以Class形式返回接口信息
12.getAnnotations:以Annotationl形式返回注解信息

第二组:java.lang.reflect.Filed类

1.getModifiers:以int形式返回修饰符
[说明:默认修饰符是0,public是1,private是2,protected是4,
static是8,final是16],public(1)+static(8)=9
2.getType:以Class形式返回类型
3.getName:返回属性名

第三组:java.lang.reflect.Method类

1.getModifiers:以int形式返回修饰符
[说明:默认修饰符是0,public是1,private是2,protected是4,
static是8,final是16]
2.getReturnType:以Class形式获取返回类型
3.getName:返回方法名
4.getParameterTypes:以Class返回参数类型数组

第四组:java.lang.reflect.Constructor类

1.getModifiers:以int形式返回修饰符
2.getName:返回构造器名(全类名)
3.getParameterTypes:以Class[]返回参数类型数组

通过反射创建对象

1.方式一:调用类中的public修饰的无参构造器
2.方式二:调用类中的指定构造器
3.Class类相关方法
newInstance:调用类中的无参构造器,获取对应类的对象
getConstructor(Class.clazz):根据参数列表,获取对应的构造器对象
getDecalaredConstructor(Class.clazz):根据参数列表,获取对应的构造器对象
4.Constructor类相关方法
setAccessible:暴破
newlnstance(Object…obj):调用构造器

Class<?> userClass = Class.forName("com.hspedu.refilection.User");// 获取User类的无参构造方法
Constructor<?> constructor = userClass.getConstructor();
// 使用无参构造方法创建User对象
Object o = constructor.newInstance();
// 打印创建的User对象
System.out.println(o);// 获取User类的带有一个String参数的构造方法
Constructor<?> constructor1 = userClass.getConstructor(String.class);
// 使用带有一个String参数的构造方法创建User对象,参数为"hsp"
Object o1 = constructor1.newInstance("hsp");
// 打印创建的User对象
System.out.println(o1);// 获取User类的私有构造方法,该方法带有两个参数:String和int
Constructor<?> constructor2 = userClass.getDeclaredConstructor(String.class, int.class);
// 设置私有构造方法为可访问
constructor2.setAccessible(true);
// 使用私有构造方法创建User对象,参数为"小明"和20
Object o2 = constructor2.newInstance("小明", 20);
// 打印创建的User对象
System.out.println(o2);

通过反射访问类中的成员

访问属性

1.根据属性名获取Field对象
Field f=clazz对象.getDeclaredField(属性名);
2.暴破:f.setAccessible(true); //f是Field
3.访问
f.set(o,值);
syso(f.get(o));
4.如果是静态属性,则set和get中的参数o,可以写成null

访问方法

1.根据方法名和参数列表获取Method方法对象:
Method m=clazz.getDeclaredMethod(方法名,XX.class); //得到本类的所有方法
2.获取对象:Object o = clazz.newlnstance();
3.暴破:m.setAccessible(true);
4.访问:Object returnValue=m.invoke(o,实参列表);
5.注意:如果是静态方法,则invoke的参数o,可以写成null!

相关文章:

【韩顺平老师Java反射笔记】

反射 文章目录 基本使用反射机制java程序在计算机有三个阶段反射相关的主要类 反射调用优化Class类的常用方法获取Class对象的6种方式哪些类型有Class对象类加载类加载时机类加载过程图 通过反射获取类的结构信息第一组&#xff1a;java.lang.Class类第二组&#xff1a;java.la…...

Arrays.asList()新增报错,该怎么解决

一、前言 在 Java 开发中&#xff0c;Arrays.asList() 是一个常用的工具方法&#xff0c;它允许开发者快速将数组转换为列表。尽管这个方法非常方便&#xff0c;但许多开发者在使用时可能会遭遇一个常见的错误&#xff1a;尝试向由 Arrays.asList() 返回的列表中添加元素时抛出…...

【热门主题】000072 分布式数据库:开启数据管理新纪元

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…...

基于Springboot开发的云野旅游平台

一、功能介绍 云野旅游平台包含管理员、用户两个角色以及前后台系统。 前台系统功能 用户登录成功后&#xff0c;可以进行查看旅游路线、最新线路、旅游资讯、个人中心、后台管理、购物车、客服等功能模块。进行相对应操作。 后台系统功能 管理员或用户登录成功后&#xf…...

2024金盾信安杯线上赛 MISC ezpng[wp]

下载题目发现给了个password和png 图片发现损坏的 password丢随波逐流一键解 base64 给出解码的结果是 cimbar搜索发现在Github有工具 然后对附件中的图片进行小厨房xor 得到一张新图片 利用工具进行跑出答案...

搭建业务的性能优化指南

这是一篇搭建业务优化的心路历程&#xff0c;也是写给搭建业务的性能优化指南。 前言 直到今天&#xff0c;淘内的页面大多都迁移到了 SSR&#xff0c;从我们终端平台 - 搭建研发团队的视角看&#xff0c;业务大致可以分为两类 —— 搭建派 和 源码派。 这两者互不冲突&#xf…...

电脑提示报错“Directx error”怎么解决?是什么原因导致的?游戏软件提示“Directx error”错误的解决方案

DirectX Error&#xff08;DX错误&#xff09;通常指的是在使用基于DirectX技术的应用程序&#xff08;尤其是游戏&#xff09;时遇到的问题。这个问题可能由多种因素导致&#xff0c;以下是一些可能的原因及相应的解决方案&#xff1a; 可能的原因 DirectX版本不匹配&#x…...

Linux——自定义简单shell

shell 自定义shell目标普通命令和内建命令&#xff08;补充&#xff09; shell实现实现原理实现代码 自定义shell 目标 能处理普通命令能处理内建命令要能帮助我们理解内建命令/本地变量/环境变量这些概念理解shell的运行 普通命令和内建命令&#xff08;补充&#xff09; …...

基于matlab程序实现人脸识别

1.人脸识别流程 1.1.1基本原理 基于YCbCr颜色空间的肤色模型进行肤色分割。在YCbCr色彩空间内对肤色进行了建模发现&#xff0c;肤色聚类区域在Cb—Cr子平面上的投影将缩减&#xff0c;与中心区域显著不同。采用这种方法的图像分割已经能够较为精确的将人脸和非人脸分割开来。…...

Unity跨平台基本原理

Unity跨平台基本原理 Unity跨平台基本原理微软的.Net是什么微软做 .Net平台的目的如何实现的.Net跨语言&#xff1f;总结 .Net Framework.Net Framework的体系结构CLR总结 如何实现的跨平台&#xff1f;.Net Core.Net FrameWork 到 .Net CoreMonoMono如何实现跨平台总结如何实现…...

【前端开发】小程序无感登录验证

概述 封装的网络请求库&#xff0c;主要用于处理 API 请求并支持自动处理 token 过期 和 token 刷新&#xff0c;适用于需要身份验证的应用场景&#xff0c;特别是在移动端中。 主要功能 自动附加 Token 在每个请求中自动附加 Authorization 头部&#xff0c;使用存储的 acces…...

Flink常见面试题

1、Flink 的四大特征&#xff08;基石&#xff09; 2、Flink 中都有哪些 Source&#xff0c;哪些 Sink&#xff0c;哪些算子&#xff08;方法&#xff09; 预定义Source 基于本地集合的source&#xff08;Collection-based-source&#xff09; 基于文件的source&#xff08;…...

spark同步mysql数据到sqlserver

使用Apache Spark将数据从MySQL同步到SQL Server是一个常见的ETL&#xff08;Extract, Transform, Load&#xff09;任务。这里提供一个基本的步骤指南&#xff0c;以及一些代码示例来帮助你完成这项工作。 ### 前提条件 1. **安装Spark**&#xff1a;确保你的环境中已经安装了…...

Python Web 开发:FastAPI 基本概念与应用

Python Web 开发&#xff1a;FastAPI 基本概念与应用 目录 ✨ 1. FastAPI 路由&#xff08;定义请求路径&#xff09;&#x1f680; 2. HTTP 请求方法&#xff08;GET、POST、PUT、DELETE&#xff09;&#x1f511; 3. 参数类型&#xff08;路径参数、查询参数、请求体&#…...

Linux设置开启启动脚本

1.问题 每次启动虚拟机需要手动启动网络&#xff0c;不然没有enss33选项 需要启动 /mnt/hgfs/dft_shared/init_env/initaial_env.sh 文件 2.解决方案 2.1 修改/etc/rc.d/rc.local 文件 /etc/rc.d/rc.local 文件会在 Linux 系统各项服务都启动完毕之后再被运行。所以你想要…...

go并发设计模式runner模式

go并发设计模式runner模式 真正运行的程序不可能是单线程运行的&#xff0c;go语言中最值得骄傲的就是CSP模型了&#xff0c;可以说go语言是CSP模型的实现。 假设现在有一个程序需要实现&#xff0c;这个程序有以下要求&#xff1a; 程序可以在分配的时间内完成工作&#xff0…...

nn.RNN解析

以下是RNN的计算公式,t时刻的隐藏状态H(t)等于前一时刻隐藏状态H(t-1)乘以参数矩阵&#xff0c;再加t时刻的输入x(t)乘以参数矩阵&#xff0c;最后再通过激活函数&#xff0c;等到t时刻隐藏状态。 下图是输出input和初始化的隐藏状态&#xff0c;当参数batch_first True时候&…...

How to monitor Spring Boot apps with the AppDynamics Java Agent

本文介绍如何使用 AppDynamics Java 代理监视 Azure Spring Apps 中的 Spring Boot 应用程序。 使用 AppDynamics Java 代理可以&#xff1a; 监视应用程序使用环境变量配置 AppDynamics Java 代理 在 AppDynamics 仪表板中检查所有监视数据 How to monitor Spring Boot app…...

Linux学习笔记12 systemd的其他命令

前文已经介绍了systemd在系统初始化中起到的作用和服务的管理和配置。这里补充一下systemd的其他工具和系统进程的管理 前文 Linux学习笔记10 系统启动初始化&#xff0c;服务和进程管理&#xff08;上&#xff09;-CSDN博客 Linux学习笔记11 系统启动初始化&#xff0c;服务…...

NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测,含优化前后对比

NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测&#xff0c;含优化前后对比 目录 NGO-CNN-BiGRU-Attention北方苍鹰算法优化卷积双向门控循环单元时间序列预测&#xff0c;含优化前后对比预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介…...

【分布式】分布式缓存

一、什么是分布式缓存 分布式缓存是一种将缓存数据存储在多个节点上的缓存方案。它通过将数据分散存储在多个节点的内存中&#xff0c;以提高系统的读取性能、降低数据库压力和提高系统可扩展性。 二、分布式缓存的优点 优点明细提高性能&#xff1a;分布式缓存可以将数据缓…...

深度学习中的迁移学习:应用与实践

引言 在深度学习领域&#xff0c;迁移学习&#xff08;Transfer Learning&#xff09;是一个非常强大且日益流行的概念&#xff0c;它通过将从一个任务中学到的知识应用于另一个任务&#xff0c;能够显著加快模型训练速度并提高其泛化能力。迁移学习在许多实际应用中都得到了广…...

28.UE5实现对话系统

目录 1.对话结构的设计&#xff08;重点&#xff09; 2.NPC对话接口的实现 2.1创建类型为pawn的蓝图 2.2创建对话接口 3.对话组件的创建 4.对话的UI设计 4.1UI_对话内容 4.2UI_对话选项 4.3UI_对话选项框 5.对话组件的逻辑实现 通过组件蓝图&#xff0c;也就是下图中的…...

Redis中的分布式锁(步步为营)

分布式锁 概述 分布式锁指的是&#xff0c;所有服务中的所有线程都去获取同一把锁&#xff0c;但只有一个线程可以成功的获得锁&#xff0c;其他没有获得锁的线程必须全部等待&#xff0c;直到持有锁的线程释放锁。 分布式锁是可以跨越多个实例&#xff0c;多个进程的锁 分布…...

CentOS 7安装mysql+JDK+Tomcat完成流程

一.安装mysql 即使是新的linux服务器&#xff0c;也要先验证是否有mysql已经安装&#xff0c;如果有进行卸载原版本&#xff0c;一定要确认是否mysql已不再使用 原安装情况&#xff08;直接执行命令即可&#xff09; whereis mysql rpm -qa | grep -i mysql rpm -e perl-DBD-M…...

C++笔记之不同框架中事件循环的核心函数:io_run()、ros_spin()、app_exec()

C笔记之不同框架中事件循环的核心函数&#xff1a;io_run()、ros_spin()、app_exec() code review! 参考笔记 1.qt-C笔记之使用QtConcurrent异步地执行槽函数中的内容&#xff0c;使其不阻塞主界面 2.qt-C笔记之QThread使用 3.qt-C笔记之多线程架构模式&#xff1a;事件信号监…...

C++异常处理

目录 一、异常的概念 二、异常的使用 &#xff08;1&#xff09;异常的抛出和捕获 &#xff08;2&#xff09;异常的重新抛出 &#xff08;3&#xff09;异常安全 &#xff08;4&#xff09;异常规范 三、自定义异常体系 四、c标注异常体系 五、异常的优缺点 在之前我们…...

【数据结构】哈希 ---万字详解

unordered系列关联式容器 在C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可达到log_2 N&#xff0c;即最差情况下需要比较红黑树的高度次&#xff0c;当树中的节点非常多时&#xff0c;查询效率也不理想。最好 的查询是&#xff0c…...

4399大数据面试题及参考答案(数据分析和数据开发)

对数据分析的理解 数据分析是一个从数据中提取有价值信息以支持决策的过程。它涵盖了数据收集、清洗、转换、建模和可视化等多个环节。 首先,数据收集是基础。这包括从各种数据源获取数据,例如数据库、文件系统、网络接口等。这些数据源可以是结构化的数据,如关系型数据库中…...

快速理解倒排索引在ElasticSearch中的作用

一.基础概念 定义&#xff1a; 倒排索引是一种数据结构&#xff0c;用来加速文本数据的搜索和检索&#xff0c;和传统的索引方式不同&#xff0c;倒排索引会被每个词汇项与包含该词汇项的文档关联起来&#xff0c;从而去实现快速的全文检索。 举例&#xff1a; 在传统的全文…...

动态网站制作教稿/windows优化大师自动安装

Python 的字符串内建函数 Python 的字符串常用内建函数如下&#xff1a; 序号方法描述1capitalize()将字符串的第一个字符转换为大写2center(width, fillchar)返回一个指定的宽度 width 居中的字符串&#xff0c;fillchar 为填充的字符&#xff0c;默认为空格。3count(str, b…...

厦门电商网站开发/营销软件有哪些

豪情豪情 豪情的blog是 http://jikey.cnblogs.com 欢迎加入js学习团队&#xff1a;3643843 运行代码 也没什么技术含量&#xff0c; 主要是return false,阻止打开链接&#xff0c;也可以用 event.preventDefault(); 转载于:https://www.cnblogs.com/jikey/archive/2010/05/28/1…...

快速制作简单的网站/怎么出售友情链接

ES6里新添加了两个很好用的东西&#xff0c;set和Array.from。 set是一种新的数据结构&#xff0c;它可以接收一个数组或者是类数组对象&#xff0c;自动去重其中的重复项目。 var arr [0,2,3,4,4,0,2];console.log(new Set(arr)) 结果如下&#xff0c;但是这里大家可以看到…...

网站做配置文件的作用/东莞优化网站关键词优化

早晨打开博客园首页&#xff0c;看到一篇文章在介绍算法。一直以来对自己最不放心的就是算法方面——高中之后数学学习处停滞状态——反正今天时间有点充裕&#xff0c;就练练手吧。 解题思路&#xff1a;从前往后遍历字符串&#xff0c;发现一个对称点时&#xff0c;以这两点为…...

wordpress添加额外css/站长seo综合查询

上一节&#xff0c;我们知道了函数作用域&#xff0c;今天&#xff0c;就来了解一下函数表达式吧&#xff01;大家是否还记得&#xff0c;一个函数变成表达式的方法&#xff0c;就是用括号将函数体包裹起来呢。函数表达式JS中&#xff0c;函数也是一种数据&#xff0c;语法上&a…...

平面设计线上兼职/免费seo

我们在上一篇已经谈到了快速排序的基本理解&#xff0c;见http://www.cnblogs.com/curo0119/p/8588565.html&#xff0c;接下来我们来更深入的了解一下快排的优化。 1、快速排序的基本思想&#xff1a; 快速排序使用分治的思想&#xff0c;通过一趟排序将待排序列分割成两部分&…...