深入理解java反射机制

2023-11-18

一,java的核心机制

java有两种核心机制:java虚拟机(JavaVirtual Machine)与垃圾收集机制(Garbage collection):

    Java虚拟机:是运行所有Java程序的抽象计算机,是Java语言的运行环境,在其上面运行Java代码编译后的字节码程序,java虚拟机实现了平台无关性。

    Java垃圾回收(Garbage Collection):自动释放不用对象内存空间,在java程序运行过程中自动进行,垃圾收集机制可大大缩短编程时间,保护程序的完整性,是Java语言安全性策略的一个重要部份。

二,java虚拟机及其结构

java垃圾回收不需要程序员手动操作,我们经常需要关注的是java虚拟机,java虚拟机承载着程序从源码到运行的全部工作。
Java虚拟机是可运行Java代码的假想计算机,有自己想象中的硬件,如处理器、堆栈、寄存器等,还具有相应的指令系统,可以执行 Java 的字节码程序。Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。
对于 JVM 的基本结构,我们可以从下图可以大致了解:
这里写图片描述

图片来自Java 虚拟机体系结构

三,程序的运行过程

从源文件创建到程序运行,Java程序要经过两大步骤:编译,运行;1、源文件由编译器编译成字节码(ByteCode) 2、字节码由java虚拟机解释运行。

    第一步(编译): 创建完源文件之后,程序会被编译器编译为.class文件。Java编译一个类时,如果这个类所依赖的类还没有被编译,编译器就会先编译这个被依赖的类,然后引用,否则直接引用。。编译后的字节码文件格式主要分为两部分:常量池和方法字节码。

    第二步(运行):java类运行的过程大概可分为两个过程:1、类的加载  2、执行。

四,类的加载

类加载过程

   java程序经过编译后形成*.class文件。通过类加载器将字节码(*.class)加载入JVM的内存中。JVM将类加载过程分成加载,连接,初始化三个阶段,其中连接阶段又可分为验证,准备,解析三个阶段。

JVM 的类加载是通过 ClassLoader 及其子类来完成的,类的层次关系和加载顺序可以由下图来描述:

这里写图片描述
1)Bootstrap ClassLoader启动类加载器

负责加载$JAVA_HOME中jre/lib/里所有的 class(JDK 代表 JDK 的安装目录,下同),或被-Xbootclasspath参数指定的路径中的,并且能被虚拟机识别的类库(如 rt.jar,所有的java.*开头的类均被 Bootstrap ClassLoader 加载)。启动类加载器由 C++ 实现,不是 ClassLoader 子类。无法被 Java 程序直接引用的。

2)Extension ClassLoader扩展类加载器

该加载器由sun.misc.Launcher ExtClassLoader

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入理解java反射机制 的相关文章

  • 如何在java swing中的每个页面中打印带有页脚的整个JPanel

    好吧 这可能很简单 但想不通 我有一个包含 JTable 的 JPanel JTable 包含很少的行 有时更多 因为我推入其中的表模型取决于数据库 但是 我不使用任何包含 JTable 的 JScolpane 因此 当 JTable 包含
  • Firebase 查询 Or'ing whereEqualTo 以获得可能值的列表

    我见过之前针对早期版本的 Firebase 提出过这个问题 https stackoverflow com questions 26700924 query based on multiple where clauses in fireba
  • V8 如何管理它的堆?

    我知道V8的垃圾收集在工作时 会从GC的root开始追踪 这样无法到达的对象就会被标记然后被清除 我的问题是GC是如何遍历那些对象的 必须有一个数据结构来存储所有可达或不可达的对象 位图 链接表 顺便说一句 JVM 也做同样的事情吗 艾伦秀
  • .java 和 .scala 类之间是否可能存在循环依赖?

    假设我在 java 文件中定义了类 A 在 scala 文件中定义了类 B A 类使用 B 类 B 类使用 A 类 如果我使用 java 编译器 则会出现编译错误 因为 B 类尚未编译 如果我使用scala编译器A类将找不到 有没有可以同时
  • 使用多个构造函数创建不可变类

    我正在阅读这一页 https docs oracle com javase tutorial essential concurrency imstrat html关于在 Java 中创建不可变类 并决定根据页面上概述的规范修改我正在编写的类
  • 从 eclipse 运行时 java.io.FileNotFoundException: (没有这样的文件或目录)

    我正在写入文件并想要控制台输出 TODO Create a game engine and call the runGame method public static void main String args throws Excepti
  • 方法不必要地被调用?

    我有一个 BaseActivity 它可以通过其他所有活动进行扩展 问题是 每当用户离开 暂停 活动时 我都会将音乐静音 我也不再接听电话 问题是 onPause每当用户在活动之间切换时就会被调用 这意味着应用程序不必要地静音和停止tele
  • 业务代表与服务定位器

    Business Delegate 和 Service Locator 之间有什么区别 两者都负责封装查找和创建机制 如果 Business Delegate 使用 Service Locator 来隐藏查找和创建机制 那么 Busines
  • LibGdx 如何使用 OrthographicCamera 滚动?

    我已经找了 10 个小时 字面意思 我已经完成了 我需要问一下 事情是我正在学习如何使用 LibGdx 来编写 Java 游戏 我正在做一个水平太空飞船游戏 所以 我最糟糕的问题是我不知道如何滚动 我认为绘制会更好地解释 我想绘制一个巨大的
  • JSP 标签+ scriptlet。如何启用脚本?

    我有一个使用标签模板的页面 我的 web xml 非常基本 我只是想在页面中运行一些代码 不 我对标签或其他替代品不感兴趣 我想使用不好的做法 scriptlet 哈哈 到目前为止 我收到了 HTTP ERROR 500 错误 Script
  • 如何使用 Java 原生接口从 Java 调用 Go 函数?

    可以通过以下方式调用 C 方法JNA https en wikipedia org wiki Java Native AccessJava 中的接口 如何使用 Go 实现相同的功能 package main import fmt impor
  • grails 上的同步块在 Windows 上有效,但在 Linux 上无效

    我有一个 grails 应用程序 它依赖于服务中的同步块 当我在 Windows 上运行它时 同步按预期工作 但当我在 ams linux 上运行时 会出现 StaleObjectStateException 该问题在以下示例中重现 cla
  • Java String.format 向整数添加空格

    我有一小段代码 我不明白输出 此输出向我的字符串格式文本添加空格 我做错了什么吗 public class HelloWorld public static void main String args int a1 540 int a2 4
  • Java中的DRY原则[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我一直在读关于DRY https en wikipedia org wiki Don 27t repeat yourself原则 虽然看起来
  • 嵌入式 tomcat 7 servlet 3.0 注释不起作用

    我有一个精简的测试项目 其中包含 Servlet 版本 3 0 用注释声明 如下所示 WebServlet test public class TestServlet extends HttpServlet private static f
  • 为什么在尝试使用 Java 连接到 RDS PostgreSQL 数据库时会收到 SocketTimeoutException?

    我有一个 Spring 应用程序 我试图在 AWS 上托管 几天来我一直在努力配置 我有一个 EC2 实例 并且能够通过 SSH 连接到它 我还在 AWS 中设置了 Postgres RDS 数据库 但我无法使用 IDE 中的代码连接到它
  • java中的比较器链

    正在阅读Oracle 关于接口的 Java 教程 https docs oracle com javase tutorial java IandI createinterface html其中给出了一个例子Card 打牌 我试图理解接口中的
  • 将字符串中的字符向左移动

    我是 Stack Overflow 的新手 有一道编程课的实验室问题一直困扰着我 该问题要求我们将字符串 s 的元素向左移动 k 次 例如 如果输入是 Hello World 和3 它将输出 lo WorldHel 对于非常大的 k 值 它
  • Java SE + Spring Data + Hibernate

    我正在尝试使用 Spring Data Hibernate 启动 Java SE 应用程序 并且到目前为止已经完成了以下操作 配置文件 Configuration PropertySource classpath hibernate pro
  • 如何在Java中跨类共享变量,我尝试了静态不起作用

    类 Testclass1 有一个变量 有一些执行会改变变量的值 现在在同一个包中有类 Testclass2 我将如何访问 Testclass2 中变量的更新值 由 Testclass1 更新 试过这个没用 注意 Testclass1和Tes

随机推荐

  • Python 基础知识

    进阶选手 Python 进阶知识 Aimin20210819的博客 关注VXG AIMIN2020 更多 目录 1 Python 是怎么理解 2 Python数据类型 四种数据类型
  • 在Firefox浏览器中导入Burp Suite证书

    在日常的渗透中 经常就是在浏览器用bp来抓包 在配置完浏览器的代理的时候就会涉及CA证书问题 在设置完代理后 再访问百度时 就会出现如下图的问题 第一步 导出证书 打开burp suite 找到 代理 Proxy 在选择 选项 Option
  • 指针加法:c = (int *) ((char *) c + 1)与 c=c+1 的区别

    示例代码 include
  • Qt通过QSttings类读取*.ini配置文件

    目录 ini文件 什么是ini文件 格式 需要的参数 需要了解的API 单例 单线程实例 多线程实例 设计一个读取ini文件的类 AppSettings类 ini文件 什么是ini文件 INI Initialization File 是微软
  • DTO和POJO实体类之间值映射

    package cn test util import java lang reflect Method import java util List public class AutoMapper public static
  • Git:Git中的远程操作和标签管理--分布式版本控制系统

    文章目录 理解分布式版本控制系统 克隆仓库 远程推送 拉取远程仓库 配置Git 标签管理 本篇主要总结关于Git中远程操作的相关事项 理解分布式版本控制系统 在进行远程操作前 首先要理解什么是分布式版本控制系统 理解这个问题时要思考这样的问
  • 从均值方差到有效前沿

    这篇文章的主要目的是介绍有效前沿这个理论工具和分析框架 我们由均值方差分析展开 逐步推演到有效前沿 然后 我们又说到有效前沿在投资或者量化中的应用场景 最后我们也总结了有效前沿的一些问题 尤其是敏感性问题 在教程中 特意加入了一些实验代码
  • 学习日记——物联网云平台组件(云消息的后续处理)

    百度云物联网组件图 设备通过MQTT等协议将数据上报到百度云平台 百度云通过主题来将设备分发给其他设备 并且可以通过规则引擎来将数据发送给时序数据库对象存储等等其他云服务 来实现我们想要的各种功能 规则引擎 一 规则引擎简介 使用规则引擎功
  • [qiankun]实战问题汇总

    qiankun 实战问题汇总 ERROR SyntaxError Cannot use import statement outside a module 问题分析 解决方案 子应用命名问题 问题分析 解决方案 jsonpFunction
  • 你的Siri收集了你的个人数据?联邦学习介绍

    MIT Technology Review Apple Siri 这是 MIT Technology Review 12月11日的 Newsletter 的部分摘录 大概意思是 iPhone 上的 Siri 在听到我们个人说 Hey Sir
  • 集群分布式quartz的需要的表

    集群分布式quartz的需要的表 集群分布式quartz一共需要的11张表 select from QRTZ FIRED TRIGGERS select from QRTZ PAUSED TRIGGER GRPS select from Q
  • NDK错(二)

    提示 No version of NDK matched the requested version 21 0 6113669 Versions available locally 22 1 7171670 23 0 7421159 方案一
  • 用执行计划看SQL的索引命中情况

    SQL Server查询超时 用执行计划看SQL的索引命中情况 从SQL Server查询语句 查询超时 需要优化 以下只优化方案之一 仅供参考 选中某段SQL后按CTRL L 查看执行计划 找出哪些表用了全局查询 选中某表按ALT F1
  • 数据结构(2)时间复杂度——渐进时间复杂度、渐进上界、渐进下界

    目录 2 1 概述 2 2 时间复杂度的计算 2 2 1 渐进复杂度 2 2 2 渐进上界 2 2 3 渐进下届 2 2 4 复杂度排序 2 2 5 举几个例子 2 1 概述 算法的基本定义 求解问题的一系列计算或者操作 衡量算法性能的指标
  • cuda求矩阵每一行最大值

    2 完成一个尺寸512 512的二维数组的每一行最大值的并行程序实现数据类型设置为float 需要完成4个版本 1 不使用共享内存 只使用全局内存 采用具有分支发散的并行归约 include cuda runtime h include d
  • Spring Cloud OAuth2 搭建授权服务器 + 客户端 + 令牌中继

    SpringBoot 版本2 1 4 RELEASE Spring Cloud版本Greenwich RELEASE 说明 token采用redis存储 用户信息采用数据库存储 oauth2官网整合springboot的例子 含服务端配置和
  • OpenJDK源码阅读-Oop&Klass

    文章目录 oop klass OBJECT hierarchy metadata hierarchy klass hierarchy oop classDiagram description klass classDiagram descr
  • Android Studio 4.0 gradle-6.1.1-all.zip 下载速率太慢或失败解决办法

    今天在家里电脑上新装了Android Studio 4 0 gradlegradle 6 1 1 all zip 下载速度实在是太慢了 后来尝试在https downloads gradle dn com distributions gra
  • python编程语言的优缺点-python语言的特点(优缺点)总结

    BEGIN 优点 1 简单 设计原则 简单 优雅 明确 易于学习 较少的关键字 结构简单 易于阅读 python代码定义更清晰 易于维护 源代码容易维护 2 广泛的开源库 丰富的第三方库 3 互动模式 支持互动模式 可从终端输入执行代码并得
  • 深入理解java反射机制

    一 java的核心机制 java有两种核心机制 java虚拟机 JavaVirtual Machine 与垃圾收集机制 Garbage collection Java虚拟机 是运行所有Java程序的抽象计算机 是Java语言的运行环境 在其