【Java基础】JavaCore核心-反射技术
文章目录
- 1.什么是反射技术
- 2.反射-获取类对象方式
- 3.反射-获取声明构造器
- 4.反射-对象创建实战
- 5.反射-方法和属性实战
- 6.反射-属性值操作实战
- 7.反射-invoke运行类方法
1.什么是反射技术
- Java的反射(reflection)机制是指在程序的运行状态中
- 可以构造任意一个类的对象
- 可以了解任意一个对象所属的类
- 可以了解任意一个类的成员变量和方法
- 可以调用任意一个对象的属性和方法。
- 这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制
- 核心:得到编译以后得class文件对象,提供了一个Class类型,就是编译后的class类对象
HelloWorld.java -> javac -> HelloWorld.classClass clz = HelloWorld.class
-
分类
-
类字节码 Class (本身也是一个类,是Java反射的源头)
-
构造器 Constructor
-
成员变量 Field
-
方法 Method
-
2.反射-获取类对象方式
public class ReflexTest {public static void main(String[] args) throws ClassNotFoundException {//1.类名.class 获取Class<User> userClass1 = User.class;System.out.println(userClass1);//2.对象获取User user = new User();Class<? extends User> userClass2 = user.getClass();System.out.println(userClass2);//3.全限定名称获取,Class.forNameClass<?> userClass3 = Class.forName("com.lixiang.reflex.User");System.out.println(userClass3);//4.通过classLoader类加载器ClassLoader classLoader = ReflexTest.class.getClassLoader();Class<?> userClass4 = classLoader.loadClass("com.lixiang.reflex.User");System.out.println(userClass4);}}public class User {private String name;private int age;}

- 反射API比较多,宏观分类
- get+要获取的东西,例如:获取属性为getField()、获取方法为getMethod()
- 只能获取公有的东西
- 注意:getMethod可以获取到本类及其父类的方法
- get+Declared+要获取的东西,例如:获取属性为getDeclaredField()、获取方法为geDeclaredtMethod()
- 可以获取全部的东西
- 注意:getDeclaredMethod只能获取到本类的方法
- get+要获取的东西,例如:获取属性为getField()、获取方法为getMethod()
3.反射-获取声明构造器
public class ReflexTest {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {//1.类名.class 获取Class<User> userClass = User.class;Constructor<?>[] declaredConstructors = userClass.getDeclaredConstructors();//获取本类的全部构造方法for (Constructor<?> declaredConstructor : declaredConstructors) {System.out.println(declaredConstructor.getName() + " "+ declaredConstructor.getParameterCount());}System.out.println("--------------------");//获取String类型的高燥方法Constructor<User> declaredConstructor = userClass.getDeclaredConstructor(String.class);System.out.println(declaredConstructor.getName() + " "+ declaredConstructor.getParameterCount());}
}

4.反射-对象创建实战
- JDK9后用构造器创建对象,class.getDeclaredConstructor( ).newInstance( )
- 日常开发定义的POJO类里面,开发规范都推荐显示的写出空构造函数
- 一是方便通过反射创建对象 ,二是子类继承父类时,默认调用super( ) 保证父类有空构造函数
| 方法名 | 说明 |
|---|---|
T newInstance( ) | 根据类的空参的构造器创建对象,类必须提供空参的构造器和public权限 |
T newInstance(Object...initargs) | 根据指定的构造方法创建对象 |
-
反射创建对象有多种方式,常用步骤如下
-
根据全类名获取对应的
Class对象 -
调用指定参数结构的构造器,生成
Constructor的实例 -
通过
Constructor的实例创建对应类的对象,并初始化类属性
-
public class ReflexTest {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {//1.类名.class 获取Class<User> userClass = User.class;//创建无参User对象Constructor<User> userConstructor1 = userClass.getDeclaredConstructor();User user = userConstructor1.newInstance();System.out.println(user);System.out.println("-----------------------");//创建一个参数的对象Constructor<User> userConstructor2 = userClass.getDeclaredConstructor(String.class);User user1 = userConstructor2.newInstance("李祥");System.out.println(user1);}}

5.反射-方法和属性实战
- 通过class获取方法
| 方法 | 说明 |
|---|---|
getMethods() | 获取当前运行类和 父类中声明的方法,需要是public访问权限的方法 |
getDeclaredMethods() | 获取当前运行时类中声明的全部方法,不包含父类中声明的方法 |
- 方法method的方法
| 方法 | 说明 |
|---|---|
getReturnType() | 获取全部的返回值 |
getParameterTypes() | 获取全部的参数 |
getModifiers() | 获取修饰符 |
getExceptionTypes() | 获取异常信息 |
public class ReflexTest {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {//获取类对象Class<User> clazz = User.class;//获取当前运行类和 父类中声明的方法,需要是public访问权限的方法Method[] methods = clazz.getMethods();for(Method method:methods){System.out.println("修饰符="+method.getModifiers()+",返回值="+method.getReturnType().getName()+",整体="+method);}System.out.println("——————————————————");//返回当前类中所有的方法,无视修饰符Method[] declaredMethods = clazz.getDeclaredMethods();for(Method method:declaredMethods){System.out.println("修饰符="+method.getModifiers()+",返回值="+method.getReturnType().getName()+",整体="+method);}}}

- 通过class对象获取属性
| 方法名 | 说明 |
|---|---|
getFields( ) | 获取当前运行类和 父类中声明的属性,需要是public访问权限的属性 |
getDeclaredFields( ) | 获取当前运行时类中声明的全部属性,不包含父类中声明的属性 |
- 属性Field的方法
| 方法 | 说明 |
|---|---|
getModifiers() | 整数形式返回此Field的修饰符,整数对应在 java.lang.reflect.Modifier里面 |
getType() | 返回 Field的属性类型 |
getName() | 返回 Field的名称 |
public class ReflexTest {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {//获取类对象Class<User> clazz = User.class;//都是private,则获取不了; 属性改为public才行Field[] fields = clazz.getFields();for(Field field:fields){System.out.println("属性名="+field.getName()+",属性类型="+field.getType().getName()+",属性修饰符="+field.getModifiers());}System.out.println("——————————————————");// 获取当前运行时类中声明的全部属性,不包含父类中声明的属性Field[] declaredFields = clazz.getDeclaredFields();for(Field field:declaredFields){System.out.println("属性名="+field.getName()+",属性类型="+field.getType().getName()+",属性修饰符="+field.getModifiers());}}}

6.反射-属性值操作实战
- 对反射进行相关操作,但如果构造器、方法、属性 没权限怎么操作?
- 可以通过
setAccessible(true),修改访问权限,Method和Field、Constructor对象都有setAccessible()方法

public class ReflexTest {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {//获取类对象Class<User> clazz = User.class;//获取public空构造函数,并创建对象(把构造函数private私有化)Constructor<User> declaredConstructor = clazz.getDeclaredConstructor();//修改访问权限,true表示暴力反射,攻破权限declaredConstructor.setAccessible(true);User user = declaredConstructor.newInstance();user.setAge(11);user.setName("李祥");System.out.println(user);}
}

- Field相关方法
| 方法 | 说明 |
|---|---|
get(Object obj) | 获取取指定对象obj上此Field的属性内容 |
set(Object obj,Object value) | 设置指定对象obj上此Field的属性内容 |

public class ReflexTest {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {Class clazz = User.class;//创建运行时类的对象//获取类对象//获取public空构造函数,并创建对象Constructor<User> declaredConstructor = clazz.getDeclaredConstructor();//修改访问权限,true表示保留反射declaredConstructor.setAccessible(true);//创建对象User user = declaredConstructor.newInstance();System.out.println(user.toString());//获取运行时类中指定变量名的属性Field name = clazz.getDeclaredField("name");//保证当前属性是可访问的name.setAccessible(true);//设置指定对象的的属性值name.set(user,"李祥");//打印对象的name属性值System.out.println(name.get(user));System.out.println(user.toString());}
}

7.反射-invoke运行类方法
- 运行类的指定方法步骤
- 获取class对象,创建对象
- 获取方法,invoke调用
- 什么是invoke调用
Object invoke(Object obj, Object … args)- invoke的中文意思是【调用、召唤】
- 用来调用某个类中的方法的,但是它不是通过当前类直接去调用而是通过反射的机制去调用
- 参数说明:obj是调用类的实例对象, args:调用方的方法参数,是可变长度的
- Object 对应原方法的返回值,若原方法无返回值,此时返回null
- 如果原方法为静态方法,此时形参 obj可为null
- 如果原方法形参列表为空,则args为null
- 如果原方法声明为private,则需要在调用此invoke()方法前,调用对象的setAccessible(true)方法
- 编码实战
- User类中加入这三个方法

public class ReflexTest {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException, NoSuchFieldException {//获取类对象Class<User> clazz = User.class;//获取public空构造函数,并创建对象Constructor<User> declaredConstructor = clazz.getDeclaredConstructor();//确保有访问权限,true表示暴力反射declaredConstructor.setAccessible(true);User user = declaredConstructor.newInstance();user.setName("李祥");System.out.println("—————————调用普通方法———————————");//获取指定的某个方法, 参数1,指明获取的方法的名称 参数2,指明获取的方法的形参列表Method say = clazz.getDeclaredMethod("say", String.class);//保证当前方法是可访问的say.setAccessible(true);//invoke调用,参数1 方法的调用者 参数2 给方法形参赋值的实参,// 返回值 是 对应类中调用的方法的返回值。Object returnValue = say.invoke(user, "李祥");System.out.println(returnValue);System.out.println("—————————调用静态方法———————————");//获取指定的某个方法, 参数1,指明获取的方法的名称 参数2,指明获取的方法的形参列表Method sleepMethod = clazz.getDeclaredMethod("sleep",String.class);//保证可以访问sleepMethod.setAccessible(true);//调用静态方法,不需要获取类对象。Object returnValue2 = sleepMethod.invoke(null,"李祥");//如果调用的运行时类中的方法没有返回值,则此invoke()返回nullSystem.out.println(returnValue2);}
}

相关文章:
【Java基础】JavaCore核心-反射技术
文章目录1.什么是反射技术2.反射-获取类对象方式3.反射-获取声明构造器4.反射-对象创建实战5.反射-方法和属性实战6.反射-属性值操作实战7.反射-invoke运行类方法1.什么是反射技术 Java的反射(reflection)机制是指在程序的运行状态中 可以构造任意一个类…...
AWGN后验估计下的均值与协方差关系(向量和标量形式)
文章目录AWGN信道向量模型后验均值与协方差的关系从实数域拓展到复数域小结AWGN信道向量模型 考虑一个随机向量x∼pX(x)\boldsymbol x \sim p_{\boldsymbol X}(\boldsymbol x)x∼pX(x),信道模型为 qxv,v∼N(0,Σ)\boldsymbol q \boldsymbol x \boldsymbol v, \…...
Linux常用命令之文件搜索命令
1、常用搜索-find 命令find英文原意find所在路径/bin/find执行权限所有用户功能描述文件搜索语法find [搜索范围] [搜索条件] (默认准确搜索)范例find /etc -name init?? 常用的搜索条件的选项包括: -name:按照文件名进行匹配查找,例&…...
ChatGPT给软件测试行业带来的可能
软件测试在软件开发过程中扮演着至关重要的角色,因为它可以确保软件的质量和可靠性。而随着人工智能技术的不断发展,ChatGPT作为一个强大的自然语言处理工具,可以在软件测试中发挥出许多重要的作用。本文将介绍ChatGPT在软件测试应用中带来的…...
Cadence Allegro 导出Properties on Nets Report报告详解
⏪《上一篇》 🏡《上级目录》 ⏩《下一篇》 目录 1,概述2,Properties on Nets Report作用3,Properties on Nets Report示例4,Properties on Nets Report导出方法4.1,方法14.2,方法2B站关注“硬小二”浏览更多演示视频...
JAVA代码 实现定位数据动态聚集并绘制多边形区域
文章目录思路1、限制聚合距离2、绘制多边形区域3、多边形区域之间合并4、多边形定边点4、逻辑流程一些性能上的优化1、多边形设置圆心2、采用分支合并思路3、清理聚集较分散区域合理性处理1、解决多边形内凹角问题2、解决定边点插入位置问题3、多边形区域扩展成果展示最近有根据…...
基于储能进行调峰和频率调节研究【超线性增益的联合优化】(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
体验 Linux 的几个监控命令(htop、nmon、netdata)
体验 Linux 的几个监控命令htopnmonnetdatahtop 安装, sudo dnf install -y htop使用, htopnmon 安装, sudo dnf install -y nmon使用, nmon输入c, 输入C, 输入m, 输入n, 输入…...
NOC大赛2022NOC软件创意编程初赛图形化小低组(小学高年级组)
一、选择题 1.如果要控制所有角色一起朝舞台区右侧移动,下面哪个积太块是不需要的 2.要想让三个角色一起移动起来,下面哪个积木块没有作用 ? 3.小猴按照下面的程序前进,小猴最后一次前进了()步。 4.小可同学写了一个画笔程序画出花朵,但是运行后什么都看不到,不可…...
python进行股票收益率计算和风险控制的实现
股票收益率计算和风险控制的实现 在进行股票投资时,计算收益率和进行风险控制是非常重要的。本文将介绍一个与此相关的函数:radio_day_cal()。 radio_day_cal()函数 def radio_day_cal(last_day, sheet_name, df_dict, code_list, new_list):i 0days…...
自从有了这套近4000页的开发文档后,Java面试路上就像开了挂一样
Java是世界最流行的编程语言,也是国内大多数IT公司的主流语言。招聘网站上Java岗位众多,Java工程师似乎不愁找工作。但仔细一看就会发现,Java岗位的招聘薪酬天差地别,人才要求也是五花八门。而在Java工程师求职过程中,…...
Python文件操作
目录 一、文件操作介绍 二、文件的打开和关闭 三、文件的读写 四、文件文件夹相关操作 五、test 一、文件操作介绍 文件 : python中文件是对象 Liunx 文件 : 一切设备都可以看成是文件 磁盘文件 管道 网络Socket 文件属性: 读 写 执行权限 就是把一些存储存放起来&…...
036:cesium加载GPX文件,显示图形
第036个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中加载GPX文件, 显示图形。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共83行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:https:/…...
【AI探索】我问了ChatGPT几个终极问题
终于尝试了一把ChatGPT的强大之处,问了一下关心的几个问题: chatGPT现在在思考吗?有没有什么你感兴趣的问题? 你认为AI会对人类产生哪些方面的影响? 你对人类所涉及到的学科有了解吗?你认为在哪些方面与人类…...
Leetcode 优先队列详解
优先队列 优先队列(Priority Queue):一种特殊的队列。在优先队列中,元素被赋予优先级,当访问队列元素时,具有最高优先级的元素最先删除 普通队列详解Leetcode 队列详解 优先队列与普通队列最大的不同点在于…...
通过两道一年级数学题反思自己
背景 做完这两道题我开始反思自己,到底是什么限制了我?是我自己?是曾经教导我的老师?还是我的父母? 是考试吗?还是什么? 提目 1、正方体个数问题 2、相碰可能性 过程 静态思维: …...
Pytorch :从零搭建一个神经网络
文章目录安装依赖从源码编译pytorchCXX_ABI问题数据集归一化Transforms搭建神经网络Components of a neural networknn.Flattennn.Linearnn.Sequentialnn.SoftmaxModel Parameters优化模型参数设置超参数添加优化循环添加 loss function优化过程完整实现模型的保存和加载安装 …...
【华为OD机试 2023最新 】 区块链文件转储系统(C++ 100%)
题目描述 区块链底层存储是一个链式文件系统,由顺序的N个文件组成,每个文件的大小不一,依次为F1,F2,…,Fn。随着时间的推移,所占存储会越来越大。 云平台考虑将区块链按文件转储到廉价的SATA盘,只有连续的区块链文件才能转储到SATA盘上,且转储的文件之和不能超过SATA盘…...
基于springcloud实现分布式架构网上商城演示【项目源码】分享
基于springcloud实现分布式架构网上商城演示摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包…...
【Qt】(自制类)适用于QTextCharFormat的字体选择对话框
先附上github链接:https://github.com/Ls-Jan/Qt_CharFormatDialog 主要是作为QFontDialog的平替/增强,毕竟Qt自带的字体选择器一言难尽(用过的都叹气)。 【运行界面】 【功能】 一目了然,可以选择字体,设置字号,设置…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
