Java 基础进阶总结(一)反射机制学习总结
文章目录
- 一、初识反射机制
- 1.1 反射机制概述
- 1.2 反射机制概念
- 1.3 Java反射机制提供的功能
- 1.4 反射机制的优点和缺点
- 二、反射机制相关的 API
一、初识反射机制
1.1 反射机制概述
JAVA 语言是一门静态语言,对象的各种信息在程序运行时便已经确认下来了,内部结构是不可变的。所以当程序在运行时,我们是无法获取对象中的信息的,但是Java 语言推出了对应解决办法--反射机制。反射机制可以动态的获取类对象的属性和方法,这便给Java语言添加了一些“灵活性”,使其成为了“准动态语言”。
JAVA 语言是先编译在运行的语言,所以程序中的对象属性在编译期便已经敲定了,不会再发生改变,但是通过反射机制可以实现属性的改变和获取。
1.2 反射机制概念

JAVA 语言正常想要获取对象一般是通过将类的完整包路径实例化之后获得的。但是通过反射机制的 getClass() 可以通过对象去反向获取类的完整包路径。
1.3 Java反射机制提供的功能
-
在运行时判断任意一个对象所属的类
-
在运行时构造任意一个类的对象
-
在运行时判断任意一个类所具有的成员变量和方法在运行时获取泛型信息
-
在运行时调用任意一个对象的成员变量和方法
-
在运行时处理注解
-
生成动态代理
1.4 反射机制的优点和缺点
-
优点: 可以实现动态创建对象和编译,体现出很大的灵活性
-
缺点: 对程序的性能有影响。使用反射基本上是一种解释性操作,相当于给 JVM 去解释一些要求,然后 JVM 通过这个要求去执行相关的操作。这类操作总是慢于直接执行相同的操作。
二、反射机制相关的 API
-
反射
动态加载对象。在运行状态中,对于任何一个类,能够获取这个类的所有属性和方法,对于一个对象,能够调用它的的任意一个属性和方法,这种动态获取类的内容和动态调用对象的方法称为反射机制。 -
通过反射机制相关的API就可以获取任何Java类的包括属性、方法、构造器、修饰符等信息。元素不必在JVM运行时进行确定,反射可以使得它们在运行时动态地进行创建或调用。
JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中
-
反射机制相关的 API
-
Class类:代表一个类
-
常用方法:
-
public static Class<?> forName(String className) : 通过 Class 直接调用,根据传入的类路径加载并将对应的类初始化
-
public Constructor<?>[] getConstructors(): 获取对象中全部的构造函数,存储进 Constructor[] 并将数组返回
-
public Field[] getDeclaredFields(): 获取对象中全部的变量,存储进 Field[] 并将数组返回
-
public Method[] getDeclaredMethods(): 获取对象中全部的方法,存储进 Method[] 并将数组返回
-
-
-
Constructor类:代表类的构造方法
-
常用方法:
- public T newInstance(Object … initargs): 搭配 Class 类的 getConstructors(),获取对应的构造方法
-
-
Field类:代表类的成员变量
-
Method:代表类的方法
-
-
反射 API 代码示例
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method;/*** 反射*/ public class reflect {//运行时获取已知名称的类或已有对象相关信息,包括类的方法,属性,父类等信息//JDK中,主要由以下类来实现Java反射机制,这些类都位于java.lang.reflect包中int m;public reflect() {System.out.println("无参构造方法");}public reflect(String k) {System.out.println("一个参数构造方法---" + k);}public reflect(String k, Integer v) {System.out.println("两个参数构造方法---" + k + ":" + v);}public void fun1() {System.out.println("无参数成员方法");}public void fun2(String k) {System.out.println("一个参数成员方法---" + k);}public void fun3(String k, Integer v) {System.out.println("两个参数成员方法---" + k + ":" + v);}public static void main(String[] args) throws Exception{//加载并初始化指定的类reflectClass classInfo = Class.forName("com.proxy.reflect");//代表类名是ASystem.out.println("类reflect构造函数如下所示:");Constructor[] constructors = classInfo.getConstructors();for (int i = 0; i < constructors.length; i++) {System.out.println(constructors[i].toString());}//获得类的所有变量System.out.println("\n类reflect变量如下:");Field[] declaredFields = classInfo.getDeclaredFields();for (int i = 0; i < declaredFields.length; i++) {System.out.println(declaredFields[i].toString());}//获得类的所有方法System.out.println("\n类reflect方法如下:");Method[] declaredMethods = classInfo.getDeclaredMethods();for (int i = 0; i < declaredMethods.length; i++) {System.out.println(declaredMethods[i].toString());}//=========================================构造方法===============================//第一种方式//Constructor[] constructors = classInfo.getConstructors();//调用两个参数构造方法constructors[0].newInstance(new Object[]{"Hello",2023});//调用一个参数构造方法constructors[1].newInstance(new Object[]{"Hello"});//调用无参构造方法constructors[2].newInstance();//第二种方式//调用无参构造方法Constructor constructor = classInfo.getConstructor();constructor.newInstance();//调用一个参数构造方法constructor = classInfo.getConstructor(new Class[]{String.class});constructor.newInstance(new Object[]{"Hello"});//调用两个参数构造方法constructor = classInfo.getConstructor(new Class[]{String.class, Integer.class});constructor.newInstance(new Object[]{"Hello", 2023});//=========================================成员方法============================//调用无参构造函数,生成新的实例对象Object obj = classInfo.getConstructor().newInstance();//调用无参成员函数Method method1 = classInfo.getMethod("fun1");//通过实例对象进行方法的实例化method1.invoke(obj);//调用一个参数成员函数Method method2 = classInfo.getMethod("fun2", String.class);method2.invoke(obj, new Object[]{"Hello"});//调用两个参数成员函数Method method3 = classInfo.getMethod("fun3", String.class, Integer.class);method3.invoke(obj, new Object[]{"Hello", 2023});}} -
执行结果

相关文章:
Java 基础进阶总结(一)反射机制学习总结
文章目录 一、初识反射机制1.1 反射机制概述1.2 反射机制概念1.3 Java反射机制提供的功能1.4 反射机制的优点和缺点 二、反射机制相关的 API 一、初识反射机制 1.1 反射机制概述 JAVA 语言是一门静态语言,对象的各种信息在程序运行时便已经确认下来了,内…...
ERROR: transport error 202: gethostbyname: unknown host报错解决方案
Java 9 syntax for remote debugger: -agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005Java 8 不适用 *:port,应该使用: -agentlib:jdwptransportdt_socket,servery,suspendn,address5005参考 https://stackoverflow.com/questions/50344957/ja…...
PyTorch高级教程:自定义模型、数据加载及设备间数据移动
在深入理解了PyTorch的核心组件之后,我们将进一步学习一些高级主题,包括如何自定义模型、加载自定义数据集,以及如何在设备(例如CPU和GPU)之间移动数据。 一、自定义模型 虽然PyTorch提供了许多预构建的模型层&#…...
JavaEE——SpringMVC中的常用注解
目录 1、RestController (1)、Controller (2)、ResponseBody 2、RequestMappping (1)、定义 (2)、使用 【1】、修饰方法 【2】、修饰类 【3】、指定方法类型 【4】、简化版…...
【严重】Metabase 基于H2引擎的远程代码执行漏洞
漏洞描述 Metabase 是一个开源的数据分析和可视化工具。 由于 CVE-2023-38646 的补丁(从H2 JDBC连接字符串中删除INIT脚本以防止命令注入)修复不完全,Metabase 仍受到命令注入的影响。攻击者可使用 H2 作为数据库引擎,通过 /api/setup/validate 端点发…...
0基础学习VR全景平台篇 第75篇:多现场
多现场是指将多台设备的直播画面整合到一个直播活动链接里面,让用户自行选择切换要看哪个直播画面的功能。既可以是同一个活动的不同角度直播,也可以是异地的直播。多现场不需要导播台,并且可以同时支持平面直播和VR直播的混合切换。多现场仅…...
html:去除input/textarea标签的拼写检查
默认情况下,textarea 会启动拼写和语法检查,表现效果就是单词拼写错误会出现红色下划线提示 <textarea></textarea>效果 有时,我们并不需要拼写检查,可以通过配置属性spellcheck"false" 去除拼写和语法检…...
自然语言处理从入门到应用——LangChain:提示(Prompts)-[提示模板:创建自定义提示模板和含有Few-Shot示例的提示模板]
分类目录:《自然语言处理从入门到应用》总目录 创建自定义提示模板 假设我们希望LLM根据函数名称生成该函数的英文语言解释。为了实现这个任务,我们将创建一个自定义的提示模板,以函数名称作为输入,并格式化提示模板以提供函数的…...
d3dx9_30.dll如何修复,分享几种一键修复方法
d3dx9_30.dll是DirectX 的一个动态链接库文件,它包含了一些用于图形和游戏的函数和资源。在了解d3dx9_30.dll的解决方法和丢失原因之前,我们先来了解一下DirectX。DirectX是一套由微软开发的多媒体和游戏编程接口(API)集合。它提供…...
6.8 稀疏数组
6.8 稀疏数组 稀疏数组是一种数据结构,在程序中数据结构的思想,是非常重要的。例如 需求:编写五子棋游戏中,有存盘退出和续上盘的功能。分析问题:因为该二维数组的很多值是默认值0,因此记录了很多没有意义…...
ROS版本的ORB-SLAM3用RealSense D455相机实时运行测试
配置环境 1. C11 检查G版本,查看是否支持C11 一般g版本大于4.7即可 g -v 2. Pangolon 地址:https://github.com/stevenlovegrove/Pangolin 先安装OpenGL,Glew ### 编译orb-slam3发现pangolin编译错误排查的环境问题 sudo apt install p…...
Vue中对对象内容调用的Demo
目录 1.对象作为数据: 2.对象数组 在Vue中,你可以通过对象的键来调用对象中的各个部分的内容。下面是一些使用Vue调用对象各部分内容的示例: 1.对象作为数据: 如果你在Vue实例的数据中有一个对象,你可以使用点语法来…...
语音识别 — 特征提取 MFCC 和 PLP
一、说明 语音识别是一种技术,通过计算机和软件系统,将人们的口头语言转换为计算机可读的文本或命令。它使用语音信号处理算法来识别和理解人类语言,并将其转换为计算机可处理的格式。语音识别技术被广泛应用于许多领域,如语音助手…...
BES 平台 SDK之按键的配置
本文章是基于BES2700 芯片,其他BESxxx 芯片可做参考,如有不当之处,欢迎评论区留言指出。仅供参考学习用! BES 平台 SDK之LED的配置_谢文浩的博客-CSDN博客 关于系统LED简介可参考上一篇文章。链接如上所示! 一&…...
【Golang系统开发】搜索引擎(1) 如何快速判断网页是否已经被爬取
文章目录 1. 写在前面2. 数组存储3. 位图存储3.1 位图简介3.2 链表法3.3 开放寻址法 1. 写在前面 在实际工作中,我们经常需要判断一个对象是否存在,比如判断用户注册登陆时候,需要判断用户是否存在,再比如搜索引擎中的爬虫&#x…...
记录--一个好用的轮子 turn.js 实现仿真翻书的效果
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 国际惯例,官网链接 官网传送门 Github地址 github上有几个demos例子,介绍了基础用法。 我参考官网的例子,写了一个demo示例 安装 turn.js 依赖 jquery 库࿰…...
《Spring Boot源码解读与原理分析》书籍推荐
Spring Boot是目前Java EE开发中颇受欢迎的框架之一。依托于底层Spring Framework的基础支撑,以及完善强大的特性设计,Spring Boot已成为业界流行的应用和微服务开发基础框架。 《Spring Boot源码解读与原理分析》共14章,分为4个部分。第一部…...
C++ 什么时候使用 vector、list、以及 deque?
如果需要高效地快速访问(随即存取),并且不在乎插入和删除的效率,使用 vector 如果需要大量的插入和删除,而且不关心快速访问 (随即存取) ,使用 list 如果需要快速访问 (随即存取) ,并且关心两端数据插入和删除&#…...
视频创作者福音,蝰蛇峡谷NUC12SNKI7视频剪辑测评
英特尔NUC绝对是PC市场里最为特殊的产品,相比众多OEM设计制造的台式机而言,英特尔NUC主打小体积、高度集成化、强扩展性以及尽可能优异的性能表现。尤其是在主打游戏体验的NUC产品出现之后,更是将极致体验演绎到了极致。 在搭载独显的幻影峡谷…...
使用Qt中的QDir类进行目录操作
文章目录 概述QDir类的基本功能获取当前目录创建目录列出目录内容筛选目录内容筛选特定命名文件 复制文件和目录删除文件和目录更改文件名 应用场景总结 概述 Qt是一个跨平台的C应用程序开发框架,其中提供了许多方便的类来处理文件和目录操作。其中,QDi…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
Spring Boot + MyBatis 集成支付宝支付流程
Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例(电脑网站支付) 1. 添加依赖 <!…...
Mac flutter环境搭建
一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...
从零手写Java版本的LSM Tree (一):LSM Tree 概述
🔥 推荐一个高质量的Java LSM Tree开源项目! https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree,专为高并发写入场景设计。 核心亮点: ⚡ 极致性能:写入速度超…...
