【java篇】反射机制简单理解

news2024/12/24 20:31:40

学到JDBC后,使用到反射机制,所以回顾反射机制相关知识点;

文章目录


文章目录

什么是反射机制?

如何理解反射呢?

总结

一、Java反射机制是什么?

二、Java反射机制中获取Class的三种方式及区别?

三、Java反射机制的应用场景有哪些?


什么是反射机制?


    Java反射机制是 Java 语言的一个重要特性。在学习 Java 反射机制前,大家应该先了解两个概念,编译期和运行期。

  • 编译期是指把源码交给编译器编译成计算机可以执行的文件的过程。在 Java 中也就是把 Java 代码编成 class 文件的过程。编译期只是做了一些翻译功能,并没有把代码放在内存中运行起来,而只是把代码当成文本进行操作,比如检查错误。
  • 运行期是把编译后的文件交给计算机执行,直到程序运行结束。所谓运行期就把在磁盘中的代码放到内存中执行起来。

  Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的反射机制。简单来说,反射机制指的是程序在运行时能够获取自身的信息。在 Java 中,只要给定类的名字,就可以通过反射机制来获得类的所有信息。

  Java 反射机制在服务器程序和中间件程序中得到了广泛运用。在服务器端,往往需要根据客户的请求,动态调用某一个对象的特定方法。

如何理解反射呢?


  一般情况下,我们使用某个类,都会提前知道这个类,以及要用它来做什么,可以直接通过new对象的方式实例化创建对象,然后使用这个对象对类进行操作,这个就属于正射

  而反射则是一开始并不知道要初始化的是什么类,无法使用new来实例化创建对象,主要是通过JDK提供的反射API来实现,在运行时才知道要操作的是什么类,并且可以获取到类的完整构造以及调用对应的方法,这就是反射


总结


一、Java反射机制是什么?

   Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。
  更简单点的说就是Java程序在运行时,通过非new的方式创建一个类的反射对象,再对类进行相关操作,比如:

  • 获取该对象的成员变量 & 赋值
  • 调用该对象的方法(含构造方法,有参/无参)
  • 判断该对象所属的类

二、Java反射机制中获取Class的三种方式及区别?


三种方式:

  • 通过MyClass.class获取
  • 通过Class.forName("类的全局定名")获取
  • 通过new MyClass().getClass()获取

方式对比:

  • 通过MyClass.class获取,JVM会使用ClassLoader类加载器将类加载到内存中,但并不会做任何类的初始化工作,返回java.lang.Class对象
  • 通过Class.forName("类的全局定名")获取,同样,类会被JVM加载到内存中,并且会进行类的静态初始化工作,返回java.lang.Class对象
  • 通过new MyClass().getClass()获取,这种方式使用了new进行实例化操作,因此== 静态初始化和非静态初始化工作都会进行 == ,getClass方法属于顶级Object类中的方法,任何子类对象都可以调用,哪个子类调用,就返回那个子类的java.lang.Class对象

  这三种方式,最终在JVM堆区对应类的java.lang.Class对象都属于同一个,也就是内存地址相同,进行==双等号比较结果为true;


 文章中内容是自己的理解加上百度百科或一些文章中获取的,仅用于自己日后复习,如有侵权,联系我删除;

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

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

相关文章

【目标检测】EfficientDet

1、论文 题目:《EfficientDet: Scalable and Efficient Object Detection》 论文地址: https://arxiv.org/pdf/1911.09070.pdf 代码地址: https://github.com/bubbliiiing/efficientdet-pytorch 2、摘要 Google Brain团队在CVPR 2020上提出…

Liunx 对函数库的理解

一、前言 我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时…

PCB入门学习— CHIP类PCB封装的创建

目录 2.12 原理图PCB封装完整性的检查 3.1 CHIP类PCB封装的创建 学习目录 2.12 原理图PCB封装完整性的检查 然后点接受变更。 www.digikey.com搜索规格的网站。 3.1 CHIP类PCB封装的创建 放焊盘——确定大小——画丝印——确定原点EFC。 创建一个PCB元件库,Ct…

React(coderwhy)- 07(路由)

认识React-Router 认识前端路由 ◼ 路由其实是网络工程中的一个术语:  在架构一个网络时,非常重要的两个设备就是路由器和交换机。  当然,目前在我们生活中路由器也是越来越被大家所熟知,因为我们生活中都会用到路由器&#x…

红黑树:比AVL抽象、自由的、更广泛的近似平衡树

RBT与AVL树的比较 AVL:高度要求差不超过1红黑树:RBT要求最长路径不超过短路径的2倍,不需要像AVL一样太平衡,稍微自由,所以旋转较少。 AVL和RBT树性能比较: 插入同样的数据,AVL树旋转更多&…

本地生活配送行业黑马,带你一键读懂闪飞侠

电商的黄金十年已经过去,本地生活的黄金市场才刚刚开启,本地生活市场的增长对同城配送的影响得有多大?2020年的新冠疫情,爆发了同城即时配送的投资新机遇!即时配送用户已超5亿。而随着即时配送行业的广泛应用&#xff…

【 Vue3 + Vite + setup语法糖 + Pinia + VueRouter + Element Plus 第三篇】(持续更新中)

在第二篇我们主要学习了路径别名,配置.env环境变量,封装axios请求,以及使用api获取数据后渲染 Element Plus表格 本期需要掌握的知识如下: 封装列表模糊查询组件实现新增 编辑 删除 模糊查询 重置 功能实现表单校验功能实现组件间传值 下期…

Compose跨平台第一弹:体验Compose for Desktop

前言 Compose是Android官方提供的声明式UI开发框架,而Compose Multiplatform是由JetBrains 维护的,对于Android开发来说,个人认为学习Jetpack Compose是必须的,因为它会成为Android主流的开发模式,而compose-jb作为一…

TikTok三大流行趋势 钛动带你看懂TikTok

武汉瑞卡迪电子商务有限公司:近日,TikTok for Business发布了《Whats Next 2023 TikTok 全球流行趋势报告》,就2023年TikTok三大趋势主题进行了介绍。 钛动科技作为TikTok官方授权代理商,是TikTok生态服务最齐全的出海服务商,凭借出色的技术与服务能力,钛动斩获了T…

论 G1 收集器的架构和如何做到回收时间用户设定

目录G1 概念JVM的内存分代假设让用户设置应用的暂停时间G1 概念 G1其实是Garbage First的意思,它不是垃圾优先的意思,而是优先处理那些垃圾多的内存块的意思。 在大的理念上,它还是遵循JVM的内存分代假设。 JVM的内存分代假设 JVM的内存分代…

https如何加密解密?

背景 我们知道,https,在网络传输中,加密。具体来说是数据加密。//客户端和服务器,写数据的时候,都会加密。即1.客户端——》服务器 2.服务器——》客户端。 如何加密 解密? 加密解密 想要加密和解密&am…

【Mysql篇】数据库事务

目录 数据库事务数据库事务介绍 JDBC事务处理 事务的ACID属性 数据库的并发问题 数据库提供的4种事务隔离级别: 在MySql中设置隔离级别 数据库事务数据库事务介绍 事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。 事务处理(…

Day1. Spring

1 课程描述IoC基础容器,主要涉及Bean对象的管理。AOP面向切面编程,主要涉及切面配置,声明式事务控制Spring整合Web环境。Web层解决方案-SpringMVC.1.1 IoC、DI和AOP思想的提出由于传统的JavaWeb出现的问题:问题1:层与层…

【问题记录】Process finished with exit code -1073740791 (0xC0000409) 注:LSTM股票预测案例中

目录 1. 问题来源2. 问题解决1. 问题来源 在跑一段 LSTM&神经网络 股票预测的代码时,遇到了下述报错,报错提示为: Process finished with exit code -1073740791 (0xC0000409) 报错截图为: 下面是整个报错的内容,这里我也截取下来了: H:\Python学习专用\深度学习\LS…

ECMAScript基础入门

JavaScript(浏览器端)ECMAScript(语法API)DOMBOM es6开始let代替var声明变量(初始化后可重新赋值),而const声明常量(初始化后不可重新赋值,否则会报错) con…

Java调用百度OCR接口实现文字识别

博主在项目开发中需要完成一个文字识别功能,由于之前有过使用百度云平台接口进行身份证识别的经历,因此这次也是自然而然的再次选择了百度AI平台,首先需要开通百度通用文字识别功能。 然后我们需要创建一个应用: 然后我们就可以…

TensorFlow 基础(一)张量

文章目录BasicsAbout shapesIndexingSingle-axis indexingMulti-axis indexingManipulating ShapesMore on dtypesReferencesimport tensorflow as tf import numpy as npBasics 张量是具有统一类型(dtype)的多维数组。它和 NumPy 中的 np.arrays 是非常…

C进阶_C语言_函数与指针_C语言指针进阶

上一篇博客http://t.csdn.cn/GYCiM 我们了解了指针相关知识,今天来了解函数和指针的关系。 目录 函数指针 函数指针数组 指向函数指针数组的指针 回调函数 qsort 冒泡排序模拟实现qsort 函数指针 我们知道,数组指针是指向数组的指针。 int arr[…

Ribbon负载均衡服务调用

文章目录一. 什么是Ribbon二. Ribbon负载均衡三. Ribbon负载均衡策略四. Ribbon饥饿加载一. 什么是Ribbon PS: 本篇文章文作者学习笔记,技术参考价值不大。 Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端,负载均衡的工具。 简单的说&#x…

Allegro174版本新功能介绍之改变报表字体大小

Allegro174版本新功能介绍之改变报表字体大小 Allegro在升级到174的时候,默认show element的字体是非常小的,类似下图,辨认起来非常困难 但是174是支持把字体调整的大一些的,具体操作如下 选择Setup选择User Preferences