【JavaSE】Java的反射机制

embedded/2024/9/22 19:31:54/

1.java反射机制

1.1简介

  • 被视为动态语言的关键,允许程序在执行期间,借助于RefectionAPI取得任何类的内部信息。在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个类对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为java反射机制。

1.2java反射机制提供的功能

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时查看任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的方法
  • 在运行时给任意一个对象的属性赋值
  • 生成动态代理

2.动态语言和静态语言

  • 动态语言:在运行时可以改变其结构的语言,比如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。也就是说在运行时代码可以根据某些条件改变自身结构。
  • 主要的动态语言:C#、javaScript、PHP、Python等
  • 静态语言:运行时结构不可变的语言,就是静态语言。
  • 主要的动态语言:|ava、C、C++等。Java有一定的动态性,可以利用反射机制、字节码操作获得类似动态语言的特性。

3.Class类

  • java在将.class字节码文件载入时,JVM会产生一个java.lang.Class对象代表该.class字节码文件。
  • Class是一个比较特殊的类,是java反射机制的基础。
  • Class类的对象表示正在运行的java程序中的类或接口。也就是任何一个类被加载时,类的.class文件读入内存的同时,都自动为其创建一个java.lang.Class对象。
  • Class类没有公共构造方法,其对象是JVM在加载类时通过调用类加载器中的defineClass()方法创建的,因此不能显式地创建一个Class对象。
  • 通过Class对象,才可以获取这个类对象的其他信息。
  • 每个类被加载之后,系统都会为该类生成一个对应的Class对象,一旦类被加载到JVM中,同一个类将不会被再次载入。

4.如何获得Class对象

  1. 使用Class类的静态方法 forName(String className),参数className表示所需类的全路径如果给的参数类找不到,会抛出ClassNotFoundException异常
  2. 用类名调用class属性来获取该类对应的Class对象,“类名.class"
  3. 使用该类的对象调用getClass()方法,来获取该类对应的Class对象
  4. 使用类的装载器

5.哪些类型可以有Class对象

  • class :外部类、成员内部类、静态内部类、局部内部类、匿名内部类
  • interface:接口.
  • 数组
  • enum:枚举
  • annotation:注解
  • 基本数据类型
  • void

6.ClassLoader 类装载器

6.1 简介

  • 一个用来加载类文件的类
  • java源代码通过javac编译器编译成类文件,然后JVM通过类文件中的字节码来执行程序,类加载器负责加载文件系统、网络或其他来源的类文件

6.2 加载的两种方式

  • 隐式加载:程序在运行过程中,通过new等方式生成对象时,隐式调用类加载器加载对应的类进入到JM中
  • 显式加载:通过Class.forName()等方法,显式地加载需要的类

6.3 类加载器的分类

  • JDK默认提供三种ClassLoader
  1. BootStrapClassLoader:根装载器,它使用C++编写,在]ava中看不到它,负责装载核心类库
  2. PlatformClassLoader:扩展类装载器,装载扩展目录ext中的jar类
  3. AppClassLoader:系统类装载器(应用类装载器),负责classpath类的加载
  • JM装载类时使用“全盘负责委托机制",当一个ClassLoader一个类的时候,除非显式地使用另一个ClassLoader,不然该类所依赖及引用的类也是由这个ClassLoader载入。
  • 一个应用程序总是由很多个类组成,java程序启动时,并不是一次把所有的类加载再运行。总是先把保证程序运行的基础类一次性加载到VM中,其他类等到VM用到的时候再加载,这样可以节省内存的开销。
     

7.反射获得泛型

  • 可以通过反射获取泛型的场景
  • 成员变量的泛型
  • 方法参数的泛型
  • 方法返回值的泛型
  • 获取带有泛型的超类或带有泛型的实现的接口
  • 不可以通过反射获取泛型的场景
  • 局部变量的泛型


http://www.ppmy.cn/embedded/16315.html

相关文章

Swift中TableView的使用

在Swift中,TableView是一种用于显示大量数据的视图控件。它通常用于展示列表和表格形式的数据,比如联系人列表、商品列表等等。 要使用TableView,首先需要在视图控制器中添加一个TableView,并设置数据源和代理。数据源负责提供Ta…

《MATLAB科研绘图与学术图表绘制从入门到精通》示例:绘制婴儿性别比例饼图

在MATLAB 中可以使用 pie 函数来创建饼图。饼图是一种展示不同部分占总体的相对比例的图表。 本示例从“婴儿出生数据.csv”文件读取婴儿出生数据,然后计算男性和女性婴儿的数量,使用MATLAB绘制饼图。 配套图书链接:https://item.jd.com…

什么是langchain

概念 LangChain 是一个用于开发由语言模型驱动的应用程序的框架。他主要拥有 2 个能力: -可以将 LLM 模型(大规模语言模型)与外部数据源进行连接 -允许与 LLM 模型进行交互基础功能 支持多种模型接口,比如 OpenAI、Hugging Fac…

Golang实现一个批量自动化执行树莓派指令的软件(3)下载

简介 话接上篇 Golang实现一个批量自动化执行树莓派指令的软件(2)指令, 这次实现文件的下载。 环境描述 运行环境: Windows, 基于Golang, 暂时没有使用什么不可跨平台接口, 理论上支持Linux/MacOS 目标终端:树莓派Debi…

电子证据的固定方法研究

序言 1.1 背景介绍 在当今数字化时代,网络诈骗已成为全球性的问题,随着互联网的普及和网络经济的发展,诈骗手段不断演化,变得更加隐蔽和复杂。这些诈骗行为不仅对个人和企业造成经济损失,还破坏了网络空间的安全和信任…

C 语言实例 - 输出浮点数

使用 printf() 与 %f 输出浮点数。 #include <stdio.h>int main() {float f; // 声明浮点数变量f 12.001234; // 定义浮点数变量printf("f 的值为 %f", f);return 0; }输出结果&#xff1a; f 的值为 12.001234

【ARMv9 DSU-120 系列 6.1 -- PPU power and reset control】

请阅读【Arm DynamIQ™ Shared Unit-120 专栏 】 文章目录 PPU power and reset controlPPUs 功能特点Power policy unit operation静态策略动态策略Implicit resets from power modesPPU power and reset control DSU-120(DynamIQ™共享单元-120)的功耗模式控制由集成在集群…

Day20-Python基础学习之正则表达式和递归(完结)

正则表达式 基础 # 正则表达式 import re ​ s "python itcast" # match 从头开始匹配 头部不匹配返回None result re.match("python", s) print(result) print(result.span()) print(result.group()) ​ # search 从开头找到结尾搜索&#xff0c;找到…