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

news2024/12/27 4:25:00

反射

文章目录

  • 基本使用
  • 反射机制
    • 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!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【热门主题】000075 探索嵌入式硬件设计的奥秘

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

Swift实现高效链表排序:一步步解读

文章目录 前言摘要问题描述题解解题思路Swift 实现代码代码分析示例测试与结果 时间复杂度空间复杂度总结关于我们 前言 本题由于没有合适答案为以往遗留问题&#xff0c;最近有时间将以往遗留问题一一完善。 148. 排序链表 不积跬步&#xff0c;无以至千里&#xff1b;不积小流…

mysql系列2—InnoDB数据存储方式

背景 本文将深入探讨InnoDB的底层存储机制&#xff0c;包括行格式、页结构、页目录以及表空间等核心概念。通过全面了解这些基础概念&#xff0c;有助于把握MySQL的存储架构&#xff0c;也为后续深入讨论MySQL的索引原理和查询优化策略奠定了基础。 1.行格式 mysql中数据以行…

vue实现echarts饼图自动轮播

echarts官网&#xff1a;Examples - Apache ECharts echartsFn.ts 把echarts函数封装成一个文件 import * as echarts from "echarts";const seriesData [{"value": 12,"name": "过流报警"},{"value": 102,"name&qu…

【Python数据分析五十个小案例】使用自然语言处理(NLP)技术分析 Twitter 情感

博客主页&#xff1a;小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介&#xff1a;分享五十个Python爬虫小案例 项目简介 什么是情感分析 情感分析&#xff08;Sentiment Analysis&#xff09;是文本分析的一部分&#xff0c;旨在识别文本中传递的情感信息&…

网络安全防护指南:筑牢网络安全防线(5/10)

一、网络安全的基本概念 &#xff08;一&#xff09;网络的定义 网络是指由计算机或者其他信息终端及相关设备组成的按照一定的规则和程序对信息收集、存储、传输、交换、处理的系统。在当今数字化时代&#xff0c;网络已经成为人们生活和工作中不可或缺的一部分。它连接了世…

宏海科技募资额有所缩减,最大销售和采购都重度依赖美的集团

《港湾商业观察》施子夫 11月29日&#xff0c;北交所上市审核委员会将召开2024年第24次上市委审议会议&#xff0c;届时将审议武汉宏海科技股份有限公司&#xff08;以下简称&#xff0c;宏海科技&#xff09;的首发上会事项。 在上会之前&#xff0c;宏海科技共收到北交所下…

算法日记 36-38day 动态规划

今天把动态规划结束掉&#xff0c;包括子序列以及编辑距离 题目&#xff1a;最长公共子序列 1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &…

Gopeed 1.6.3 | 不限速下载工具附百度网盘不限速教程

Gopeed是一款高效且易于使用的下载软件。它具有加速下载速度的功能&#xff0c;可以帮助用户更快地下载文件。此外&#xff0c;Gopeed还支持多线程下载&#xff0c;可以同时下载多个文件&#xff0c;提高下载效率。它提供了简洁的界面和简单的操作&#xff0c;方便用户操作和管…

K8S版本和istio版本的对照关系

版本对照关系 下载地址1 下载地址2

【大数据学习 | Spark-SQL】关于RDD、DataFrame、Dataset对象

1. 概念&#xff1a; RDD&#xff1a; 弹性分布式数据集&#xff1b; DataFrame&#xff1a; DataFrame是一种以RDD为基础的分布式数据集&#xff0c;类似于传统数据库中的二维表格。带有schema元信息&#xff0c;即DataFrame所表示的二维表数据集的每一列都带有名称和类型…

如何调用百度文心一言API实现智能问答

诸神缄默不语-个人CSDN博文目录 百度需要先认证个人信息才能使用LLM API。 文章目录 1. 获得 API Key2. 撰写代码并实现提问和回答2.1 用openai包实现调用2.2 用openai包实现流式调用2.3 用openai包实现工具调用2.4 构建智能体2.5 文生图2.6 图生图 3. 用gradio建立大模型问答…

python除了熟悉的pandas,openpyxl库也很方便的支持编辑Excel表

excel表格是大家经常用到的文件格式&#xff0c;各行各业都会跟它打交道。之前文章我们介绍了使用openpyxl和xlrd库读取excel表数据&#xff0c;使用xlwt库创建和编辑excel表&#xff0c;在办公自动化方面可以方便我们快速处理数据&#xff0c;帮助我们提升效率。 python之open…

JMeter 并发策略-针对准点秒杀场景的压测实现

一、场景的压测实现 1&#xff0c;创建线程组&#xff0c;10并发用户执行5次&#xff1b; 2&#xff0c;创建 Synchronizing Timer 元件,用于同步线程&#xff0c;设置同步元件 Synchronizing Timer 3&#xff0c;创建 http 请求4&#xff0c;创建 view results in table 元件…

损失函数分类

1. NLLLoss&#xff08;负对数似然损失&#xff09; 定义&#xff1a; 直接对预测的概率 p(yi) 的负对数求平均。通常配合 Softmax 使用&#xff0c;输入为对数概率。 优点&#xff1a; 对离散分类问题效果良好。更灵活&#xff0c;用户可以自行计算 Softmax。 缺点&#x…

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

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

算法笔记:力扣148. 排序链表

思路&#xff1a; 将链表中的节点一一取出放到list集合中&#xff0c;然后通过Comparator实现排序&#xff0c;对排序好的list节点一一取出&#xff0c;组成排序好的新链表。 关键思路&#xff1a; Comparator实现对ListNode的排序&#xff1b; &#x1f4a1;注意&#xff…

Kafka知识体系

一、认识Kafka 1. kafka适用场景 消息系统&#xff1a;kafka不仅具备传统的系统解耦、流量削峰、缓冲、异步通信、可扩展性、可恢复性等功能&#xff0c;还有其他消息系统难以实现的消息顺序消费及消息回溯功能。 存储系统&#xff1a;kafka把消息持久化到磁盘上&#xff0c…

MacOS安装MySQL数据库和Java环境以及Navicat

安装MySQL 去官网下载&#xff1a;MySQL 下载好后安装&#xff0c;在设置里往下滑&#xff0c;出现了这样&#xff0c;就代表安装成功了 接下来配置环境&#xff1a; 首先在我们的设备上找到终端并打开,输入 vim ~/.bash_profile(注意vim后面的空格)&#xff0c;输入完成后点击…

Css、less和Sass(SCSS)的区别详解

文章目录 Css、less和Sass&#xff08;SCSS&#xff09;的区别详解一、引言二、CSS 简介1.1、CSS 示例 三、Less 简介2.1、Less 特性2.2、Less 示例 四、Sass&#xff08;SCSS&#xff09;简介3.1、Sass 特性3.2、SCSS 示例 五、总结 Css、less和Sass&#xff08;SCSS&#xff…