Ai
1 Star 0 Fork 0

旺仔/jvm

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
09-load-class-process.html 23.99 KB
一键复制 编辑 原始数据 按行查看 历史
github-actions[bot] 提交于 2021-11-10 19:17 +08:00 . Deploy to GitHub pages
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="generator" content="VuePress 2.0.0-beta.27">
<link rel="icon" href="https://avatars.githubusercontent.com/u/43716716?s=200&v=4"><title>类加载的过程 | JVM 底层原理最全知识总结</title><meta name="description" content="Doocs开源社区">
<link rel="preload" href="/jvm/assets/js/runtime~app.26a29375.js" as="script"><link rel="preload" href="/jvm/assets/css/styles.94043d91.css" as="style"><link rel="preload" href="/jvm/assets/js/567.d52b7511.js" as="script"><link rel="preload" href="/jvm/assets/js/app.545f3cc1.js" as="script">
<link rel="stylesheet" href="/jvm/assets/css/styles.94043d91.css">
</head>
<body>
<div id="app"><!--[--><div class="theme-container"><!--[--><header class="navbar"><div class="toggle-sidebar-button" title="toggle sidebar" aria-expanded="false" role="button" tabindex="0"><div class="icon" aria-hidden="true"><span></span><span></span><span></span></div></div><span><a href="/jvm/" class=""><!----><span class="site-name can-hide">JVM 底层原理最全知识总结</span></a></span><div class="navbar-links-wrapper" style=""><!--[--><!--]--><nav class="navbar-links can-hide"><!--[--><div class="navbar-links-item"><a class="nav-link external" href="https://github.com/doocs/jvm" rel="noopener noreferrer" target="_blank" aria-label="GitHub"><!--[--><!--]--> GitHub <span><svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><!--[--><span class="sr-only">open in new window</span><!--]--></span><!--[--><!--]--></a></div><!--]--></nav><!--[--><!--]--><button class="toggle-dark-button" title="toggle dark mode"><svg style="" class="icon" focusable="false" viewBox="0 0 32 32"><path d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6z" fill="currentColor"></path><path d="M5.394 6.813l1.414-1.415l3.506 3.506L8.9 10.318z" fill="currentColor"></path><path d="M2 15.005h5v2H2z" fill="currentColor"></path><path d="M5.394 25.197L8.9 21.691l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 25.005h2v5h-2z" fill="currentColor"></path><path d="M21.687 23.106l1.414-1.415l3.506 3.506l-1.414 1.414z" fill="currentColor"></path><path d="M25 15.005h5v2h-5z" fill="currentColor"></path><path d="M21.687 8.904l3.506-3.506l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 2.005h2v5h-2z" fill="currentColor"></path></svg><svg style="display:none;" class="icon" focusable="false" viewBox="0 0 32 32"><path d="M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z" fill="currentColor"></path></svg></button><form class="search-box" role="search"><input type="search" autocomplete="off" spellcheck="false" value><!----></form></div></header><!--]--><div class="sidebar-mask"></div><!--[--><aside class="sidebar"><nav class="navbar-links"><!--[--><div class="navbar-links-item"><a class="nav-link external" href="https://github.com/doocs/jvm" rel="noopener noreferrer" target="_blank" aria-label="GitHub"><!--[--><!--]--> GitHub <span><svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><!--[--><span class="sr-only">open in new window</span><!--]--></span><!--[--><!--]--></a></div><!--]--></nav><!--[--><!--]--><ul class="sidebar-links"><!--[--><!--[--><p class="sidebar-heading sidebar-item active">指南</p><ul class=""><li><!--[--><a href="/jvm/00-quickstart.html" class="nav-link sidebar-item" aria-label="开始学习"><!--[--><!--]--> 开始学习 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a href="/jvm/01-jvm-memory-structure.html" class="nav-link sidebar-item" aria-label="JVM 内存结构"><!--[--><!--]--> JVM 内存结构 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a href="/jvm/02-hotspot-jvm-object.html" class="nav-link sidebar-item" aria-label="HotSpot 虚拟机对象探秘"><!--[--><!--]--> HotSpot 虚拟机对象探秘 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a href="/jvm/03-gc-algorithms.html" class="nav-link sidebar-item" aria-label="垃圾收集策略与算法"><!--[--><!--]--> 垃圾收集策略与算法 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a href="/jvm/04-hotspot-gc.html" class="nav-link sidebar-item" aria-label="HotSpot 垃圾收集器"><!--[--><!--]--> HotSpot 垃圾收集器 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a href="/jvm/05-memory-allocation-gc.html" class="nav-link sidebar-item" aria-label="内存分配与回收策略"><!--[--><!--]--> 内存分配与回收策略 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a href="/jvm/06-jvm-performance-tuning.html" class="nav-link sidebar-item" aria-label="JVM 性能调优"><!--[--><!--]--> JVM 性能调优 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a href="/jvm/07-class-structure.html" class="nav-link sidebar-item" aria-label="类文件结构"><!--[--><!--]--> 类文件结构 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a href="/jvm/08-load-class-time.html" class="nav-link sidebar-item" aria-label="类加载的时机"><!--[--><!--]--> 类加载的时机 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/jvm/09-load-class-process.html" class="router-link-active router-link-exact-active nav-link router-link-active sidebar-item active" aria-label="类加载的过程"><!--[--><!--]--> 类加载的过程 <!--[--><!--]--></a><ul class="sidebar-sub-items"><li><!--[--><a aria-current="page" href="/jvm/09-load-class-process.html#加载" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="加载"><!--[--><!--]--> 加载 <!--[--><!--]--></a><ul class="sidebar-sub-items"><li><!--[--><a aria-current="page" href="/jvm/09-load-class-process.html#加载的过程" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="加载的过程"><!--[--><!--]--> 加载的过程 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/jvm/09-load-class-process.html#获取二进制字节流" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="获取二进制字节流"><!--[--><!--]--> 获取二进制字节流 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/jvm/09-load-class-process.html#非数组类-与-数组类-加载比较" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="“非数组类”与“数组类”加载比较"><!--[--><!--]--> “非数组类”与“数组类”加载比较 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/jvm/09-load-class-process.html#注意事项" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="注意事项"><!--[--><!--]--> 注意事项 <!--[--><!--]--></a><!----><!--]--></li></ul><!--]--></li><li><!--[--><a aria-current="page" href="/jvm/09-load-class-process.html#验证" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="验证"><!--[--><!--]--> 验证 <!--[--><!--]--></a><ul class="sidebar-sub-items"><li><!--[--><a aria-current="page" href="/jvm/09-load-class-process.html#验证的重要性" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="验证的重要性"><!--[--><!--]--> 验证的重要性 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/jvm/09-load-class-process.html#验证的过程" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="验证的过程"><!--[--><!--]--> 验证的过程 <!--[--><!--]--></a><!----><!--]--></li></ul><!--]--></li><li><!--[--><a aria-current="page" href="/jvm/09-load-class-process.html#准备" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="准备"><!--[--><!--]--> 准备 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/jvm/09-load-class-process.html#解析" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="解析"><!--[--><!--]--> 解析 <!--[--><!--]--></a><!----><!--]--></li><li><!--[--><a aria-current="page" href="/jvm/09-load-class-process.html#初始化" class="router-link-active router-link-exact-active nav-link sidebar-item" aria-label="初始化"><!--[--><!--]--> 初始化 <!--[--><!--]--></a><!----><!--]--></li></ul><!--]--></li><li><!--[--><a href="/jvm/10-class-loader.html" class="nav-link sidebar-item" aria-label="类加载器"><!--[--><!--]--> 类加载器 <!--[--><!--]--></a><!----><!--]--></li></ul><!--]--><!--]--></ul><!--[--><!--]--></aside><!--]--><!--[--><main class="page"><!--[--><!--]--><div class="theme-default-content"><!--[--><h1 id="类加载的过程" tabindex="-1"><a class="header-anchor" href="#类加载的过程" aria-hidden="true">#</a> 类加载的过程</h1><p>类加载过程包括 5 个阶段:加载、验证、准备、解析和初始化。</p><h2 id="加载" tabindex="-1"><a class="header-anchor" href="#加载" aria-hidden="true">#</a> 加载</h2><h3 id="加载的过程" tabindex="-1"><a class="header-anchor" href="#加载的过程" aria-hidden="true">#</a> 加载的过程</h3><p>“加载”是“类加载”过程的一个阶段,不能混淆这两个名词。在加载阶段,虚拟机需要完成 3 件事:</p><ul><li>通过类的全限定名获取该类的二进制字节流。</li><li>将二进制字节流所代表的静态结构转化为方法区的运行时数据结构。</li><li>在内存中创建一个代表该类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口。</li></ul><h3 id="获取二进制字节流" tabindex="-1"><a class="header-anchor" href="#获取二进制字节流" aria-hidden="true">#</a> 获取二进制字节流</h3><p>对于 Class 文件,虚拟机没有指明要从哪里获取、怎样获取。除了直接从编译好的 .class 文件中读取,还有以下几种方式:</p><ul><li>从 zip 包中读取,如 jar、war 等;</li><li>从网络中获取,如 Applet;</li><li>通过动态代理技术生成代理类的二进制字节流;</li><li>由 JSP 文件生成对应的 Class 类;</li><li>从数据库中读取,如 有些中间件服务器可以选择把程序安装到数据库中来完成程序代码在集群间的分发。</li></ul><h3 id="非数组类-与-数组类-加载比较" tabindex="-1"><a class="header-anchor" href="#非数组类-与-数组类-加载比较" aria-hidden="true">#</a> “非数组类”与“数组类”加载比较</h3><ul><li>非数组类加载阶段可以使用系统提供的引导类加载器,也可以由用户自定义的类加载器完成,开发人员可以通过定义自己的类加载器控制字节流的获取方式(如重写一个类加载器的 <code>loadClass()</code> 方法)。</li><li>数组类本身不通过类加载器创建,它是由 Java 虚拟机直接创建的,再由类加载器创建数组中的元素类。</li></ul><h3 id="注意事项" tabindex="-1"><a class="header-anchor" href="#注意事项" aria-hidden="true">#</a> 注意事项</h3><ul><li>虚拟机规范未规定 Class 对象的存储位置,对于 HotSpot 虚拟机而言,Class 对象比较特殊,它虽然是对象,但存放在方法区中。</li><li>加载阶段与连接阶段的部分内容交叉进行,加载阶段尚未完成,连接阶段可能已经开始了。但这两个阶段的开始时间仍然保持着固定的先后顺序。</li></ul><h2 id="验证" tabindex="-1"><a class="header-anchor" href="#验证" aria-hidden="true">#</a> 验证</h2><h3 id="验证的重要性" tabindex="-1"><a class="header-anchor" href="#验证的重要性" aria-hidden="true">#</a> 验证的重要性</h3><p>验证阶段确保 Class 文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。</p><h3 id="验证的过程" tabindex="-1"><a class="header-anchor" href="#验证的过程" aria-hidden="true">#</a> 验证的过程</h3><ul><li>文件格式验证 验证字节流是否符合 Class 文件格式的规范,并且能被当前版本的虚拟机处理,验证点如下: <ul><li>是否以魔数 0XCAFEBABE 开头。</li><li>主次版本号是否在当前虚拟机处理范围内。</li><li>常量池是否有不被支持的常量类型。</li><li>指向常量的索引值是否指向了不存在的常量。</li><li>CONSTANT_Utf8_info 型的常量是否有不符合 UTF8 编码的数据。</li><li>......</li></ul></li><li>元数据验证 对字节码描述信息进行语义分析,确保其符合 Java 语法规范。</li><li>字节码验证 本阶段是验证过程中最复杂的一个阶段,是对方法体进行语义分析,保证方法在运行时不会出现危害虚拟机的事件。</li><li>符号引用验证 本阶段发生在解析阶段,确保解析正常执行。</li></ul><h2 id="准备" tabindex="-1"><a class="header-anchor" href="#准备" aria-hidden="true">#</a> 准备</h2><p>准备阶段是正式为类变量(或称“静态成员变量”)分配内存并设置初始值的阶段。这些变量(不包括实例变量)所使用的内存都在方法区中进行分配。</p><p>初始值“通常情况下”是数据类型的零值(0, null...),假设一个类变量的定义为:</p><div class="language-java ext-java line-numbers-mode"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">int</span> value <span class="token operator">=</span> <span class="token number">123</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers"><span class="line-number">1</span><br></div></div><p>那么变量 value 在准备阶段过后的初始值为 0 而不是 123,因为这时候尚未开始执行任何 Java 方法。</p><p>存在“特殊情况”:如果类字段的字段属性表中存在 ConstantValue 属性,那么在准备阶段 value 就会被初始化为 ConstantValue 属性所指定的值,假设上面类变量 value 的定义变为:</p><div class="language-java ext-java line-numbers-mode"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">final</span> <span class="token keyword">int</span> value <span class="token operator">=</span> <span class="token number">123</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers"><span class="line-number">1</span><br></div></div><p>那么在准备阶段虚拟机会根据 ConstantValue 的设置将 value 赋值为 123。</p><h2 id="解析" tabindex="-1"><a class="header-anchor" href="#解析" aria-hidden="true">#</a> 解析</h2><p>解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。</p><h2 id="初始化" tabindex="-1"><a class="header-anchor" href="#初始化" aria-hidden="true">#</a> 初始化</h2><p>类初始化阶段是类加载过程的最后一步,是执行类构造器 <code>&lt;clinit&gt;()</code> 方法的过程。</p><p><code>&lt;clinit&gt;()</code> 方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块(static {} 块)中的语句合并产生的,编译器收集的顺序是由语句在源文件中出现的顺序所决定的。</p><p>静态语句块中只能访问定义在静态语句块之前的变量,定义在它之后的变量,在前面的静态语句块中可以赋值,但不能访问。如下方代码所示:</p><div class="language-java ext-java line-numbers-mode"><pre class="language-java"><code><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Test</span> <span class="token punctuation">{</span>
<span class="token keyword">static</span> <span class="token punctuation">{</span>
i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token comment">// 给变量赋值可以正常编译通过</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 这句编译器会提示“非法向前引用”</span>
<span class="token punctuation">}</span>
<span class="token keyword">static</span> <span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><p><code>&lt;clinit&gt;()</code> 方法不需要显式调用父类构造器,虚拟机会保证在子类的 <code>&lt;clinit&gt;()</code> 方法执行之前,父类的 <code>&lt;clinit&gt;()</code> 方法已经执行完毕。</p><p>由于父类的 <code>&lt;clinit&gt;()</code> 方法先执行,意味着父类中定义的静态语句块要优先于子类的变量赋值操作。如下方代码所示:</p><div class="language-java ext-java line-numbers-mode"><pre class="language-java"><code><span class="token keyword">static</span> <span class="token keyword">class</span> <span class="token class-name">Parent</span> <span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">int</span> <span class="token class-name">A</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span>
<span class="token keyword">static</span> <span class="token punctuation">{</span>
<span class="token class-name">A</span> <span class="token operator">=</span> <span class="token number">2</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">static</span> <span class="token keyword">class</span> <span class="token class-name">Sub</span> <span class="token keyword">extends</span> <span class="token class-name">Parent</span> <span class="token punctuation">{</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">int</span> <span class="token class-name">B</span> <span class="token operator">=</span> <span class="token class-name">A</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token class-name">Sub<span class="token punctuation">.</span>B</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 输出 2</span>
<span class="token punctuation">}</span>
</code></pre><div class="line-numbers"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br></div></div><p><code>&lt;clinit&gt;()</code> 方法不是必需的,如果一个类没有静态语句块,也没有对类变量的赋值操作,那么编译器可以不为这个类生成 <code>&lt;clinit&gt;()</code> 方法。</p><p>接口中不能使用静态代码块,但接口也需要通过 <code>&lt;clinit&gt;()</code> 方法为接口中定义的静态成员变量显式初始化。但接口与类不同,接口的 <code>&lt;clinit&gt;()</code> 方法不需要先执行父类的 <code>&lt;clinit&gt;()</code> 方法,只有当父接口中定义的变量使用时,父接口才会初始化。</p><p>虚拟机会保证一个类的 <code>&lt;clinit&gt;()</code> 方法在多线程环境中被正确加锁、同步。如果多个线程同时去初始化一个类,那么只会有一个线程去执行这个类的 <code>&lt;clinit&gt;()</code> 方法。</p><!--]--></div><footer class="page-meta"><div class="meta-item edit-link"><a class="nav-link external meta-item-label" href="https://github.com/doocs/jvm/edit/main/docs/09-load-class-process.md" rel="noopener noreferrer" target="_blank" aria-label="编辑"><!--[--><!--]--> 编辑 <span><svg class="icon outbound" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><!--[--><span class="sr-only">open in new window</span><!--]--></span><!--[--><!--]--></a></div><div class="meta-item last-updated"><span class="meta-item-label">最近更新时间: </span><span class="meta-item-info">2021/9/1 上午2:22:41</span></div><div class="meta-item contributors"><span class="meta-item-label">贡献者: </span><span class="meta-item-info"><!--[--><!--[--><span class="contributor" title="email: szuyanglb@outlook.com">yanglbme</span><!--[-->, <!--]--><!--]--><!--[--><span class="contributor" title="email: szuyanglb@outlook.com">Yang Libin</span><!--[-->, <!--]--><!--]--><!--[--><span class="contributor" title="email: yanglbme@users.noreply.github.com">yanglbme</span><!----><!--]--><!--]--></span></div></footer><nav class="page-nav"><p class="inner"><span class="prev"><a href="/jvm/08-load-class-time.html" class="nav-link" aria-label="类加载的时机"><!--[--><!--]--> 类加载的时机 <!--[--><!--]--></a></span><span class="next"><a href="/jvm/10-class-loader.html" class="nav-link" aria-label="类加载器"><!--[--><!--]--> 类加载器 <!--[--><!--]--></a></span></p></nav><!--[--><!--]--></main><!--]--></div><!----><!--]--></div>
<script src="/jvm/assets/js/runtime~app.26a29375.js" defer></script><script src="/jvm/assets/js/567.d52b7511.js" defer></script><script src="/jvm/assets/js/app.545f3cc1.js" defer></script>
</body>
</html>
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/coding_one/jvm.git
git@gitee.com:coding_one/jvm.git
coding_one
jvm
jvm
gh-pages

搜索帮助