再次认识java反射

news/2025/3/10 0:21:17/文章来源:https://www.cnblogs.com/liyuanhong/p/18761711

一、概述

在认识java反射之前我们先来认识一下什么是动态语言与静态语言。

动态语言

是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以 被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。

主要动态语言:Object-C、C#、JavaScript、PHP、Python、Erlang。

静态语言

与动态语言相对应的,运行时结构不可变的语言就是静态语言。如Java、C、C++。Java不是动态语言,但Java可以称之为“准动态语言”。即Java有一定的动态性,我们可以利用反射机制、字节码操作获得类似动态语言的特性。 Java的动态性让编程的时候更加灵活!

像C、C++这类型语言一旦编译完成之后,运行时加载到内存后,程序内部结构无法被改变,因此被称为静态语言。但是java由于有反射的功能,可以通过反射让程序在运行过程中,动态的加载类到内存,从而改变了程序结构,因此java在一定程度上具备了动态语言的特性。

反射

Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期 借助于ReflectionAPI取得任何类的内部信息,并能直接操作任意对象的内 部属性及方法。

加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为:反射。

反射提供的功能

  1. 在运行时判断任意一个对象所属的类
  2. 在运行时构造任意一个类的对象
  3. 在运行时判断任意一个类所具有的成员变量和方法
  4. 在运行时获取泛型信息
  5. 在运行时调用任意一个对象的成员变量和方法
  6. 在运行时处理注解
  7. 生成动态代理

反射工作原理

步骤一:源文件转class文件

在Java编程中,一旦我们完成了一个Java项目的编写,每个Java源文件都会经过编译器的处理,生成相应的.class文件。这是反射机制得以发挥作用的第一步。

步骤二:加载到jvm

当我们的Java程序开始运行时,ClassLoader会介入并负责将编译好的.class文件加载到JVM中。这一步是反射机制得以顺利工作的关键。

当一个类被成功加载到JVM后,系统会在内存中自动为其创建一个Class对象。接下来,我们可以通过这个Class对象来获取该类的各种信息,包括其属性、方法和构造函数。这一过程可以通过以下方式实现:
在日常编程中,我们通常使用new关键字来创建对象。实际上,这个过程是通过Class对象来完成的。需要注意的是,这个Class文件是在编译阶段就已经生成的,也就是说,程序在运行时,JVM是按照预先定义好的规则来执行和创建对象的。
在使用new关键字创建对象时,我们必须明确指定类名,这种实现方式被称为硬编码,缺乏灵活性。然而,通过Java的反射机制,我们只需传入类名参数,就能动态生成对象。这种灵活性极大地降低了程序各部分之间的耦合性,使得程序更加易于扩展和维护。因此,许多Java开发框架都充分利用了反射机制的优势。

使用反射

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【问题】HashMap的computeIfAbsent方法丢失数据问题分析

问题背景 前段时间碰到客户问题发现是 ConcurrentHashMap的computeIfAbsent导致死循环(ConcurrentHashMap死循环问题分析)就很好奇HashMap的computeIfAbsent会不会也有问题,一试之下发现确实存在问题,相同的代码在HashMap中会丢失插入的数据。 发生原因 【循环添加】时,如…

CFA学习

定量分析 利率 利率的定义:被认为是 ① 平衡借贷双方的平衡点(equilibrium interest rates)② 贴现率(货币的时间价值)③ 机会成本 利率的组成:通货膨胀➕各种风险 计算【现值/终值】用时间轴确实一目了然! # 经济学 # 财务报表分析 # 公司理财 # 投资组合管理 # 权益投…

INFINI Labs 产品更新 | Easysearch 增加异步搜索等新特性

INFINI Labs 产品更新发布!此次更新,Easysearch 增加了新的功能和数据类型,包括 wildcard 数据类型、Point in time 搜索 API、异步搜索 API、数值和日期字段的 doc-values 搜索支持,Console 新增了日志查询功能。 INFINI Easysearch v1.11.0 INFINI Easysearch 是一个分布…

语法trick

for (int i = 1; i <= n; ++i) {cout << dist[i] << " \n"[i == n];}

百万架构师第四十七课:并发编程的原理(二)|JavaGuide

原文链接 JavaGuide《并发编程的艺术》 并发编程的实现原理 目标上节课内容回顾 synchronized 原理分析 wait 和 notify Lock 同步锁回顾原子性 可见性 有序性JMM ​ JMM 是 JAVA 里边定义的内存模型。定义了多线程和我们内存交互的规范。屏蔽了硬件和操作系统访问内存的差异。…

[极客大挑战 2019]Havefun 1

进网站显示一只猫,于是看源代码 发现下面有注释<!--$cat=$_GET[cat];echo $cat;if($cat==dog){echo Syc{cat_cat_cat_cat};}-->所以在后面加上/index.php?cat=dog即可(小猫可爱捏)

提取excel中的图片

需求: 提取excel中嵌入单元格的图片 实现思路: 用pandas读取文件,对于嵌入图片的单元格则会显示其函数 问题:wps与office嵌入方法有所不同,wps使用函数嵌套,而office则是设置随单元格大小变动,对于后者,会被视为是悬浮的图片,使用pandas无法提取任何一张图片 源文件如…

2019年-PTA模拟赛-L2-1 链表去重(一维数组模拟链表)

一维数组模拟链表一维数组模拟链表 被删除的结点仍然在e数组中,因此记录一下被删除的结点的地址就可以找到其值AcCode: #include<bits/stdc++.h> using namespace std; int e[100010], ne[100010], vis[100010]; vector<int> delNode; int main(){int N, rootAdre…

C语言实验一作业

实验任务1:#include <stdio.h> int main() {printf(" O \n");printf("<H>\n");printf("I I\n");printf(" O \n");printf("<H>\n");printf("I I\n");return 0; }#include <stdio.h> in…

二、搭建MyBatis采用xml方式,验证CRUD(增删改查操作)

二、搭建MyBatis采用xml方式,验证CRUD(增删改查操作)@目录二、搭建MyBatis采用xml方式,验证CRUD(增删改查操作)2.1 开发环境2.2 创建maven工程2.3 创建User实体2.4 创建MyBatis的核心配置文件2.5 创建mapper接口2.6 创建MyBatis的映射文件2.7配置日志打印2.8 通过junit测…

MongoDB 的开源替代方案FerretD发了 2.0 版

FerretDB 宣布推出 2.0 版本,由 DocumentDB 驱动,作为 MongoDB 的开源替代方案。它带来性能提升、功能兼容性、向量搜索能力和复制支持。FerretDB 基于 Apache 2.0 许可发布,与 MongoDB 的驱动程序和工具兼容,可作为 MongoDB 5.0 及以上版本的直接替代品。FerretDB 2.x 利用…