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

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 语言是一门静态语言&#xff0c;对象的各种信息在程序运行时便已经确认下来了&#xff0c;内…...

ERROR: transport error 202: gethostbyname: unknown host报错解决方案

Java 9 syntax for remote debugger: -agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005Java 8 不适用 *:port&#xff0c;应该使用: -agentlib:jdwptransportdt_socket,servery,suspendn,address5005参考 https://stackoverflow.com/questions/50344957/ja…...

PyTorch高级教程:自定义模型、数据加载及设备间数据移动

在深入理解了PyTorch的核心组件之后&#xff0c;我们将进一步学习一些高级主题&#xff0c;包括如何自定义模型、加载自定义数据集&#xff0c;以及如何在设备&#xff08;例如CPU和GPU&#xff09;之间移动数据。 一、自定义模型 虽然PyTorch提供了许多预构建的模型层&#…...

JavaEE——SpringMVC中的常用注解

目录 1、RestController &#xff08;1&#xff09;、Controller &#xff08;2&#xff09;、ResponseBody 2、RequestMappping &#xff08;1&#xff09;、定义 &#xff08;2&#xff09;、使用 【1】、修饰方法 【2】、修饰类 【3】、指定方法类型 【4】、简化版…...

【严重】Metabase 基于H2引擎的远程代码执行漏洞

漏洞描述 Metabase 是一个开源的数据分析和可视化工具。 由于 CVE-2023-38646 的补丁(从H2 JDBC连接字符串中删除INIT脚本以防止命令注入)修复不完全&#xff0c;Metabase 仍受到命令注入的影响。攻击者可使用 H2 作为数据库引擎&#xff0c;通过 /api/setup/validate 端点发…...

0基础学习VR全景平台篇 第75篇:多现场

多现场是指将多台设备的直播画面整合到一个直播活动链接里面&#xff0c;让用户自行选择切换要看哪个直播画面的功能。既可以是同一个活动的不同角度直播&#xff0c;也可以是异地的直播。多现场不需要导播台&#xff0c;并且可以同时支持平面直播和VR直播的混合切换。多现场仅…...

html:去除input/textarea标签的拼写检查

默认情况下&#xff0c;textarea 会启动拼写和语法检查&#xff0c;表现效果就是单词拼写错误会出现红色下划线提示 <textarea></textarea>效果 有时&#xff0c;我们并不需要拼写检查&#xff0c;可以通过配置属性spellcheck"false" 去除拼写和语法检…...

自然语言处理从入门到应用——LangChain:提示(Prompts)-[提示模板:创建自定义提示模板和含有Few-Shot示例的提示模板]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 创建自定义提示模板 假设我们希望LLM根据函数名称生成该函数的英文语言解释。为了实现这个任务&#xff0c;我们将创建一个自定义的提示模板&#xff0c;以函数名称作为输入&#xff0c;并格式化提示模板以提供函数的…...

d3dx9_30.dll如何修复,分享几种一键修复方法

d3dx9_30.dll是DirectX 的一个动态链接库文件&#xff0c;它包含了一些用于图形和游戏的函数和资源。在了解d3dx9_30.dll的解决方法和丢失原因之前&#xff0c;我们先来了解一下DirectX。DirectX是一套由微软开发的多媒体和游戏编程接口&#xff08;API&#xff09;集合。它提供…...

6.8 稀疏数组

6.8 稀疏数组 稀疏数组是一种数据结构&#xff0c;在程序中数据结构的思想&#xff0c;是非常重要的。例如 需求&#xff1a;编写五子棋游戏中&#xff0c;有存盘退出和续上盘的功能。分析问题&#xff1a;因为该二维数组的很多值是默认值0&#xff0c;因此记录了很多没有意义…...

ROS版本的ORB-SLAM3用RealSense D455相机实时运行测试

配置环境 1. C11 检查G版本&#xff0c;查看是否支持C11 一般g版本大于4.7即可 g -v 2. Pangolon 地址&#xff1a;https://github.com/stevenlovegrove/Pangolin 先安装OpenGL&#xff0c;Glew ### 编译orb-slam3发现pangolin编译错误排查的环境问题 sudo apt install p…...

Vue中对对象内容调用的Demo

目录 1.对象作为数据&#xff1a; 2.对象数组 在Vue中&#xff0c;你可以通过对象的键来调用对象中的各个部分的内容。下面是一些使用Vue调用对象各部分内容的示例&#xff1a; 1.对象作为数据&#xff1a; 如果你在Vue实例的数据中有一个对象&#xff0c;你可以使用点语法来…...

语音识别 — 特征提取 MFCC 和 PLP

一、说明 语音识别是一种技术&#xff0c;通过计算机和软件系统&#xff0c;将人们的口头语言转换为计算机可读的文本或命令。它使用语音信号处理算法来识别和理解人类语言&#xff0c;并将其转换为计算机可处理的格式。语音识别技术被广泛应用于许多领域&#xff0c;如语音助手…...

BES 平台 SDK之按键的配置

本文章是基于BES2700 芯片&#xff0c;其他BESxxx 芯片可做参考&#xff0c;如有不当之处&#xff0c;欢迎评论区留言指出。仅供参考学习用&#xff01; BES 平台 SDK之LED的配置_谢文浩的博客-CSDN博客 关于系统LED简介可参考上一篇文章。链接如上所示&#xff01; 一&…...

【Golang系统开发】搜索引擎(1) 如何快速判断网页是否已经被爬取

文章目录 1. 写在前面2. 数组存储3. 位图存储3.1 位图简介3.2 链表法3.3 开放寻址法 1. 写在前面 在实际工作中&#xff0c;我们经常需要判断一个对象是否存在&#xff0c;比如判断用户注册登陆时候&#xff0c;需要判断用户是否存在&#xff0c;再比如搜索引擎中的爬虫&#x…...

记录--一个好用的轮子 turn.js 实现仿真翻书的效果

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 国际惯例&#xff0c;官网链接 官网传送门 Github地址 github上有几个demos例子&#xff0c;介绍了基础用法。 我参考官网的例子&#xff0c;写了一个demo示例 安装 turn.js 依赖 jquery 库&#xff0…...

《Spring Boot源码解读与原理分析》书籍推荐

Spring Boot是目前Java EE开发中颇受欢迎的框架之一。依托于底层Spring Framework的基础支撑&#xff0c;以及完善强大的特性设计&#xff0c;Spring Boot已成为业界流行的应用和微服务开发基础框架。 《Spring Boot源码解读与原理分析》共14章&#xff0c;分为4个部分。第一部…...

C++ 什么时候使用 vector、list、以及 deque?

如果需要高效地快速访问(随即存取)&#xff0c;并且不在乎插入和删除的效率&#xff0c;使用 vector 如果需要大量的插入和删除&#xff0c;而且不关心快速访问 (随即存取) &#xff0c;使用 list 如果需要快速访问 (随即存取) &#xff0c;并且关心两端数据插入和删除&#…...

视频创作者福音,蝰蛇峡谷NUC12SNKI7视频剪辑测评

英特尔NUC绝对是PC市场里最为特殊的产品&#xff0c;相比众多OEM设计制造的台式机而言&#xff0c;英特尔NUC主打小体积、高度集成化、强扩展性以及尽可能优异的性能表现。尤其是在主打游戏体验的NUC产品出现之后&#xff0c;更是将极致体验演绎到了极致。 在搭载独显的幻影峡谷…...

使用Qt中的QDir类进行目录操作

文章目录 概述QDir类的基本功能获取当前目录创建目录列出目录内容筛选目录内容筛选特定命名文件 复制文件和目录删除文件和目录更改文件名 应用场景总结 概述 Qt是一个跨平台的C应用程序开发框架&#xff0c;其中提供了许多方便的类来处理文件和目录操作。其中&#xff0c;QDi…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...