<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>TrueSolのblog</title><link>https://blog.arcanelune.top/</link><description>Recent content from TrueSolのblog</description><generator>Hugo</generator><language>zh-cn</language><managingEditor>3359429309@qq.com (TrueSol)</managingEditor><webMaster>3359429309@qq.com (TrueSol)</webMaster><copyright>本博客所有文章除特别声明外，均采用 BY-NC-SA 许可协议。转载请注明出处！</copyright><lastBuildDate>Thu, 07 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.arcanelune.top/index.xml" rel="self" type="application/rss+xml"/><item><title>JDK 安装与环境变量配置完整教程（Windows+Linux 双平台）</title><link>https://blog.arcanelune.top/post/java-notes/java-note-01/</link><pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate><author>3359429309@qq.com (TrueSol)</author><guid>https://blog.arcanelune.top/post/java-notes/java-note-01/</guid><description>
<![CDATA[<h1>JDK 安装与环境变量配置完整教程（Windows+Linux 双平台）</h1><p>作者：TrueSol（3359429309@qq.com）</p>
        
          
        
        <hr><p>本文2026-05-07首发于<a href='https://blog.arcanelune.top/'>TrueSolのblog</a>，最后修改于2026-05-07</p><p>本博客所有文章除特别声明外，均采用 BY-NC-SA 许可协议。转载请注明出处！</p>]]></description><category>Java教程</category><category>环境搭建</category></item><item><title>Java 笔记 21：反射</title><link>https://blog.arcanelune.top/post/java-notes/java-note-21/</link><pubDate>Sat, 11 Apr 2026 00:00:00 +0000</pubDate><author>3359429309@qq.com (TrueSol)</author><guid>https://blog.arcanelune.top/post/java-notes/java-note-21/</guid><description>
<![CDATA[<h1>Java 笔记 21：反射</h1><p>作者：TrueSol（3359429309@qq.com）</p>
        
          <h1 id="什么是反射">
<a class="header-anchor" href="#%e4%bb%80%e4%b9%88%e6%98%af%e5%8f%8d%e5%b0%84"></a>
什么是反射？
</h1><p><strong>正射</strong>：
编译期就确定要操作的类，代码写死</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="n">User</span><span class="w"> </span><span class="n">user</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">User</span><span class="p">();</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">user</span><span class="p">.</span><span class="na">setName</span><span class="p">(</span><span class="s">&#34;张三&#34;</span><span class="p">);</span><span class="w">
</span></span></span></code></pre></div><p>特点：编译期类型检查，性能高，灵活性差</p>
<p><strong>反射</strong>：
<strong>运行期</strong>才动态获取类的信息、操作类的成员</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="n">Class</span><span class="p">.</span><span class="na">forName</span><span class="p">(</span><span class="s">&#34;com.example.User&#34;</span><span class="p">).</span><span class="na">getMethod</span><span class="p">(</span><span class="s">&#34;setName&#34;</span><span class="p">).</span><span class="na">invoke</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;张三&#34;</span><span class="p">);</span><span class="w">
</span></span></span></code></pre></div><p>特点：运行期动态解析，性能略低+灵活性极强</p>
<h1 id="反射的底层原理">
<a class="header-anchor" href="#%e5%8f%8d%e5%b0%84%e7%9a%84%e5%ba%95%e5%b1%82%e5%8e%9f%e7%90%86"></a>
反射的底层原理
</h1><p>Java 类加载机制是反射的基础：</p>
<ol>
<li><code>.java</code> 源码编译为 <code>.class</code> 字节码文件</li>
<li>类加载器将 <code>.class</code> 加载到 JVM 内存，生成<strong>唯一的 <code>Class</code> 对象</strong>（包含类的所有元信息）</li>
<li>反射就是操作这个 <code>Class</code> 对象；<strong>反向获取和操作类的一切</strong></li>
</ol>
<h1 id="反射相关的主要类">
<a class="header-anchor" href="#%e5%8f%8d%e5%b0%84%e7%9b%b8%e5%85%b3%e7%9a%84%e4%b8%bb%e8%a6%81%e7%b1%bb"></a>
反射相关的主要类
</h1><table>
  <thead>
      <tr>
          <th style="text-align: left">类名</th>
          <th style="text-align: left">所在包</th>
          <th style="text-align: left">核心作用</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: left"><code>Class</code></td>
          <td style="text-align: left"><code>java.lang</code></td>
          <td style="text-align: left">反射的<strong>入口</strong>，代表一个类的元信息</td>
      </tr>
      <tr>
          <td style="text-align: left"><code>Constructor</code></td>
          <td style="text-align: left"><code>java.lang.reflect</code></td>
          <td style="text-align: left">代表类的构造器，用于动态创建对象</td>
      </tr>
      <tr>
          <td style="text-align: left"><code>Field</code></td>
          <td style="text-align: left"><code>java.lang.reflect</code></td>
          <td style="text-align: left">代表类的成员变量，用于动态获取 / 修改属性值</td>
      </tr>
      <tr>
          <td style="text-align: left"><code>Method</code></td>
          <td style="text-align: left"><code>java.lang.reflect</code></td>
          <td style="text-align: left">代表类的成员方法，用于动态调用方法</td>
      </tr>
      <tr>
          <td style="text-align: left"><code>AccessibleObject</code></td>
          <td style="text-align: left"><code>java.lang.reflect</code></td>
          <td style="text-align: left">上述 3 个类的父类，提供<strong>关闭访问检查</strong>的能力</td>
      </tr>
  </tbody>
</table>
<h1 id="反射的作用为什么要用反射">
<a class="header-anchor" href="#%e5%8f%8d%e5%b0%84%e7%9a%84%e4%bd%9c%e7%94%a8%e4%b8%ba%e4%bb%80%e4%b9%88%e8%a6%81%e7%94%a8%e5%8f%8d%e5%b0%84"></a>
反射的作用（为什么要用反射？）
</h1><p>反射是 Java 生态的<strong>基石</strong>，没有反射就没有现代 Java 框架，核心作用有 3 个：</p>
<h2 id="1-实现框架的动态性和可扩展性">
<a class="header-anchor" href="#1-%e5%ae%9e%e7%8e%b0%e6%a1%86%e6%9e%b6%e7%9a%84%e5%8a%a8%e6%80%81%e6%80%a7%e5%92%8c%e5%8f%af%e6%89%a9%e5%b1%95%e6%80%a7"></a>
1. 实现框架的动态性和可扩展性
</h2><p>这是反射最核心的应用场景：</p>
<ul>
<li><strong>Spring IOC</strong>：读取配置文件 / 注解中的类全限定名，通过反射动态创建 Bean 并管理</li>
<li><strong>MyBatis</strong>：Mapper 接口的动态代理，通过反射生成实现类，动态调用 SQL</li>
<li><strong>JDBC 驱动加载</strong>：<code>Class.forName(&quot;com.mysql.cj.jdbc.Driver&quot;)</code> 就是通过反射加载驱动</li>
</ul>
<h2 id="2编写通用工具类">
<a class="header-anchor" href="#2%e7%bc%96%e5%86%99%e9%80%9a%e7%94%a8%e5%b7%a5%e5%85%b7%e7%b1%bb"></a>
2.编写通用工具类
</h2><p>避免为每个类写重复逻辑，实现代码复用：</p>
<ul>
<li><strong>对象属性拷贝</strong>：Spring <code>BeanUtils.copyProperties()</code>、Apache <code>BeanUtils</code>，底层都是反射</li>
<li><strong>JSON 序列化</strong>：Jackson、Gson，通过反射获取对象所有属性；序列化为 JSON</li>
</ul>
<h3 id="3-突破封装限制特殊场景">
<a class="header-anchor" href="#3-%e7%aa%81%e7%a0%b4%e5%b0%81%e8%a3%85%e9%99%90%e5%88%b6%e7%89%b9%e6%ae%8a%e5%9c%ba%e6%99%af"></a>
3. 突破封装限制（特殊场景）
</h3><p>可以操作类的 <code>private</code> 成员，处理特殊需求（如单元测试、框架内部逻辑）。</p>
<h1 id="反射的优缺点">
<a class="header-anchor" href="#%e5%8f%8d%e5%b0%84%e7%9a%84%e4%bc%98%e7%bc%ba%e7%82%b9"></a>
反射的优缺点
</h1><h3 id="优点">
<a class="header-anchor" href="#%e4%bc%98%e7%82%b9"></a>
优点
</h3><ol>
<li><strong>极强的灵活性</strong>：编译期不依赖具体类，运行期动态加载，是框架可扩展性的核心</li>
<li><strong>代码复用性高</strong>：可以编写通用工具类，避免重复代码</li>
<li><strong>突破封装</strong>：可以操作私有成员，处理特殊场景</li>
</ol>
<h3 id="缺点">
<a class="header-anchor" href="#%e7%bc%ba%e7%82%b9"></a>
缺点
</h3><ol>
<li><strong>性能损耗</strong>：反射是运行期动态解析，比直接调用慢 <strong>10~100 倍</strong>，频繁使用会严重影响性能</li>
<li><strong>破坏封装性</strong>：操作私有成员违反了面向对象的封装原则，可能导致安全问题</li>
<li><strong>编译期无法检查错误</strong>：类、方法、属性是否存在，只有运行期才会抛异常，增加调试难度</li>
<li><strong>代码可读性差</strong>：反射代码比常规代码复杂，不利于后期维护</li>
</ol>
<h1 id="反射调用优化3-个核心手段">
<a class="header-anchor" href="#%e5%8f%8d%e5%b0%84%e8%b0%83%e7%94%a8%e4%bc%98%e5%8c%963-%e4%b8%aa%e6%a0%b8%e5%bf%83%e6%89%8b%e6%ae%b5"></a>
反射调用优化（3 个核心手段）
</h1><p><strong>1.缓存反射对象（最有效、最常用）</strong>
<strong>不要每次都重新获取 <code>Class、Constructor、Method、Field</code> 对象</strong>，缓存起来复用，性能可以提升几十倍。
代码示例：优化前后对比</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">java.lang.reflect.Method</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">ReflectOptimization</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// 优化前：每次调用都重新获取Method对象</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">noCache</span><span class="p">()</span><span class="w"> </span><span class="kd">throws</span><span class="w"> </span><span class="n">Exception</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">100000</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">User</span><span class="w"> </span><span class="n">user</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">User</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">Method</span><span class="w"> </span><span class="n">method</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">User</span><span class="p">.</span><span class="na">class</span><span class="p">.</span><span class="na">getMethod</span><span class="p">(</span><span class="s">&#34;setName&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">String</span><span class="p">.</span><span class="na">class</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">method</span><span class="p">.</span><span class="na">invoke</span><span class="p">(</span><span class="n">user</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;张三&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// 优化后：缓存Method对象，复用</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">private</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">Method</span><span class="w"> </span><span class="n">SET_NAME_METHOD</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">static</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">try</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">SET_NAME_METHOD</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">User</span><span class="p">.</span><span class="na">class</span><span class="p">.</span><span class="na">getMethod</span><span class="p">(</span><span class="s">&#34;setName&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">String</span><span class="p">.</span><span class="na">class</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">NoSuchMethodException</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="k">throw</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">RuntimeException</span><span class="p">(</span><span class="n">e</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">withCache</span><span class="p">()</span><span class="w"> </span><span class="kd">throws</span><span class="w"> </span><span class="n">Exception</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">&lt;</span><span class="w"> </span><span class="n">100000</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">User</span><span class="w"> </span><span class="n">user</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">User</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">SET_NAME_METHOD</span><span class="p">.</span><span class="na">invoke</span><span class="p">(</span><span class="n">user</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;张三&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// 性能测试</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="kd">throws</span><span class="w"> </span><span class="n">Exception</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="kt">long</span><span class="w"> </span><span class="n">start1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">currentTimeMillis</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">noCache</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;无缓存耗时：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">(</span><span class="n">System</span><span class="p">.</span><span class="na">currentTimeMillis</span><span class="p">()</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">start1</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">&#34;ms&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="kt">long</span><span class="w"> </span><span class="n">start2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">currentTimeMillis</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">withCache</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;有缓存耗时：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">(</span><span class="n">System</span><span class="p">.</span><span class="na">currentTimeMillis</span><span class="p">()</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">start2</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">&#34;ms&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p><strong>2.使用 <code>MethodHandle</code>（JDK 7+ 推荐）</strong>
<code>MethodHandle</code> 是 JDK 7 引入的轻量级反射 API，性能比传统反射高很多，接近直接调用。
代码示例：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">java.lang.invoke.MethodHandle</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kn">import</span><span class="w"> </span><span class="nn">java.lang.invoke.MethodHandles</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kn">import</span><span class="w"> </span><span class="nn">java.lang.invoke.MethodType</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">MethodHandleDemo</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="kd">throws</span><span class="w"> </span><span class="n">Throwable</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 1. 获取MethodHandles.Lookup</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">MethodHandles</span><span class="p">.</span><span class="na">Lookup</span><span class="w"> </span><span class="n">lookup</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MethodHandles</span><span class="p">.</span><span class="na">lookup</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 2. 定义方法类型：返回值void，参数String</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">MethodType</span><span class="w"> </span><span class="n">methodType</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MethodType</span><span class="p">.</span><span class="na">methodType</span><span class="p">(</span><span class="kt">void</span><span class="p">.</span><span class="na">class</span><span class="p">,</span><span class="w"> </span><span class="n">String</span><span class="p">.</span><span class="na">class</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 3. 查找方法</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">MethodHandle</span><span class="w"> </span><span class="n">setNameHandle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">lookup</span><span class="p">.</span><span class="na">findVirtual</span><span class="p">(</span><span class="n">User</span><span class="p">.</span><span class="na">class</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;setName&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">methodType</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 4. 调用方法</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">User</span><span class="w"> </span><span class="n">user</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">User</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">setNameHandle</span><span class="p">.</span><span class="na">invoke</span><span class="p">(</span><span class="n">user</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;李四&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">user</span><span class="p">.</span><span class="na">getName</span><span class="p">());</span><span class="w"> </span><span class="c1">// 输出：李四</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p><strong>避免频繁调用 <code>setAccessible(true)</code></strong>
<code>setAccessible(true)</code> 本身也有性能损耗，<strong>只需要调用一次</strong>，后续复用即可（配合缓存使用）。</p>
<h1 id="关闭访问检查setaccessibletrue">
<a class="header-anchor" href="#%e5%85%b3%e9%97%ad%e8%ae%bf%e9%97%ae%e6%a3%80%e6%9f%a5setaccessibletrue"></a>
关闭访问检查：<code>setAccessible(true)</code>
</h1><p><strong>作用：</strong>
<code>AccessibleObject</code> 是 <code>Constructor、Field、Method</code> 的父类，提供 <code>setAccessible(boolean flag)</code> 方法：</p>
<ul>
<li><strong>默认 <code>false</code></strong>：开启访问检查，无法访问 <code>private</code> 成员</li>
<li><strong>设为 <code>true</code></strong>：<strong>关闭 JVM 的访问权限检查</strong>，可以访问 <code>private</code> 成员（俗称「暴力反射」）
代码示例：</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">java.lang.reflect.Field</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">SetAccessibleDemo</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="kd">throws</span><span class="w"> </span><span class="n">Exception</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">User</span><span class="w"> </span><span class="n">user</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">User</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 获取private属性name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Field</span><span class="w"> </span><span class="n">nameField</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">User</span><span class="p">.</span><span class="na">class</span><span class="p">.</span><span class="na">getDeclaredField</span><span class="p">(</span><span class="s">&#34;name&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// ❌ 不关闭访问检查，直接操作会抛异常：IllegalAccessException</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// nameField.set(user, &#34;张三&#34;);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// ✅ 关闭访问检查</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">nameField</span><span class="p">.</span><span class="na">setAccessible</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">nameField</span><span class="p">.</span><span class="na">set</span><span class="p">(</span><span class="n">user</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;张三&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">nameField</span><span class="p">.</span><span class="na">get</span><span class="p">(</span><span class="n">user</span><span class="p">));</span><span class="w"> </span><span class="c1">// 输出：张三</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p><strong>注意事项</strong></p>
<ol>
<li><strong>不是修改访问修饰符</strong>：<code>setAccessible(true)</code> 只是关闭了 JVM 的检查，<code>private</code> 依然是 <code>private</code>，代码层面的访问修饰符没有改变</li>
<li><strong>安全管理器限制</strong>：如果 JVM 启动了安全管理器（<code>SecurityManager</code>），可能会禁止调用 <code>setAccessible(true)</code></li>
<li><strong>只需要调用一次</strong>：配合缓存使用，不要每次都调用</li>
</ol>
<h1 id="class类">
<a class="header-anchor" href="#class%e7%b1%bb"></a>
Class类
</h1><h2 id="什么是-class-类">
<a class="header-anchor" href="#%e4%bb%80%e4%b9%88%e6%98%af-class-%e7%b1%bb"></a>
什么是 Class 类？
</h2><blockquote>
<p>当 JVM 加载一个 <code>.class</code> 字节码文件时，会在堆内存中自动生成<strong>唯一的一个 <code>Class</code> 对象</strong>。这个对象就像类的 &ldquo;身份证&rdquo;，包含了该类的所有结构信息，反射就是通过操作这个对象，反向获取和操作类的一切。</p>
</blockquote>
<h2 id="class-类的核心特点">
<a class="header-anchor" href="#class-%e7%b1%bb%e7%9a%84%e6%a0%b8%e5%bf%83%e7%89%b9%e7%82%b9"></a>
Class 类的核心特点
</h2><ul>
<li>
<p><strong>没有公共构造方法</strong></p>
<ul>
<li>不能用 <code>new Class()</code> 创建实例，只能通过 JVM 自动生成或 3 种固定方式获取</li>
<li>构造方法是私有的：<code>private Class(ClassLoader loader)</code></li>
</ul>
</li>
<li>
<p><strong>单例性</strong></p>
<ul>
<li>JVM 中，<strong>一个类永远只有一个 Class 实例</strong></li>
<li>无论用哪种方式获取，得到的都是同一个对象</li>
</ul>
</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="n">Class</span><span class="o">&lt;?&gt;</span><span class="w"> </span><span class="n">c1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Class</span><span class="p">.</span><span class="na">forName</span><span class="p">(</span><span class="s">&#34;com.example.User&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">Class</span><span class="o">&lt;?&gt;</span><span class="w"> </span><span class="n">c2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">User</span><span class="p">.</span><span class="na">class</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">Class</span><span class="o">&lt;?&gt;</span><span class="w"> </span><span class="n">c3</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">User</span><span class="p">().</span><span class="na">getClass</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">c1</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">c2</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">c2</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">c3</span><span class="p">);</span><span class="w"> </span><span class="c1">// true</span><span class="w">
</span></span></span></code></pre></div><ul>
<li>
<p><strong>不可变性</strong></p>
<ul>
<li>Class 对象一旦被 JVM 加载，其内容就不可改变</li>
<li>不能通过 Class 对象修改类的结构（只能读取和调用）</li>
</ul>
</li>
<li>
<p><strong>会触发类的加载和初始化</strong></p>
<ul>
<li><code>Class.forName(&quot;全类名&quot;)</code> 会触发类的静态代码块执行</li>
<li><code>类名.class</code> 和 <code>对象.getClass()</code> 不会触发静态初始化</li>
</ul>
</li>
</ul>
<h2 id="class-类的常用方法及演示">
<a class="header-anchor" href="#class-%e7%b1%bb%e7%9a%84%e5%b8%b8%e7%94%a8%e6%96%b9%e6%b3%95%e5%8f%8a%e6%bc%94%e7%a4%ba"></a>
Class 类的常用方法及演示
</h2><p><strong>演示对象</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kn">package</span><span class="w"> </span><span class="nn">com.example</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">private</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">name</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">private</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">age</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">gender</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="nf">User</span><span class="p">()</span><span class="w"> </span><span class="p">{}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">private</span><span class="w"> </span><span class="nf">User</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">name</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">age</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="na">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">name</span><span class="p">;</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="na">age</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">age</span><span class="p">;</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">sayHello</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;Hello, &#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">name</span><span class="p">);</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">private</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="nf">getSecret</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="s">&#34;I love Java&#34;</span><span class="p">;</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// getter/setter</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="nf">getName</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">name</span><span class="p">;</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">setName</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">name</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="na">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">name</span><span class="p">;</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h3 id="获取-class-对象的方法">
<a class="header-anchor" href="#%e8%8e%b7%e5%8f%96-class-%e5%af%b9%e8%b1%a1%e7%9a%84%e6%96%b9%e6%b3%95"></a>
获取 Class 对象的方法
</h3><p>这是所有反射操作的第一步，3 种方式各有适用场景：
<strong>1.<code>Class.forName(String className)</code></strong>
例：<code>Class.forName(&quot;com.example.User&quot;)</code></p>
<blockquote>
<p>框架首选，编译期不依赖类，运行期动态加载，会触发静态初始化</p>
</blockquote>
<p><strong>2.<code>类名.class</code></strong>
例：<code>User.class</code></p>
<blockquote>
<p>编译期确定，需要导入类包，不会触发静态初始化，多用于参数传递</p>
</blockquote>
<p><strong>3.<code>对象.getClass()</code></strong>
例：<code>new User().getClass()</code></p>
<blockquote>
<p>已有对象时使用，能获取对象的<strong>实际运行类</strong>（适配多态）</p>
</blockquote>
<h3 id="创建对象的方法">
<a class="header-anchor" href="#%e5%88%9b%e5%bb%ba%e5%af%b9%e8%b1%a1%e7%9a%84%e6%96%b9%e6%b3%95"></a>
创建对象的方法
</h3><p>通过 Class 对象动态创建类的实例：
<strong>1.<code>T newInstance()</code>：通过无参构造创建对象</strong></p>
<blockquote>
<p>JDK9 已废弃，推荐使用其他方法</p>
</blockquote>
<p><strong>2.<code>Constructor&lt;T&gt; getConstructor(Class&lt;?&gt;... parameterTypes)</code>：获取 public 无参 / 有参构造器</strong></p>
<blockquote>
<p>只能获取 public 的</p>
</blockquote>
<p><strong>3.<code>Constructor&lt;T&gt; getDeclaredConstructor(Class&lt;?&gt;... parameterTypes)</code>：获取任意构造器（包括 private）</strong></p>
<blockquote>
<p>配合 <code>setAccessible(true)</code> 使用</p>
</blockquote>
<p>代码示例：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">java.lang.reflect.Constructor</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">ClassCreateObjectDemo</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="kd">throws</span><span class="w"> </span><span class="n">Exception</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Class</span><span class="o">&lt;</span><span class="n">User</span><span class="o">&gt;</span><span class="w"> </span><span class="n">userClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">User</span><span class="p">.</span><span class="na">class</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 1. 推荐方式：通过public无参构造创建对象</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Constructor</span><span class="o">&lt;</span><span class="n">User</span><span class="o">&gt;</span><span class="w"> </span><span class="n">noArgConstructor</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">userClass</span><span class="p">.</span><span class="na">getConstructor</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">User</span><span class="w"> </span><span class="n">user1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">noArgConstructor</span><span class="p">.</span><span class="na">newInstance</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">user1</span><span class="p">.</span><span class="na">setName</span><span class="p">(</span><span class="s">&#34;张三&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;无参构造创建：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">user1</span><span class="p">.</span><span class="na">getName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 2. 通过private有参构造创建对象（暴力反射）</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Constructor</span><span class="o">&lt;</span><span class="n">User</span><span class="o">&gt;</span><span class="w"> </span><span class="n">privateConstructor</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">userClass</span><span class="p">.</span><span class="na">getDeclaredConstructor</span><span class="p">(</span><span class="n">String</span><span class="p">.</span><span class="na">class</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="p">.</span><span class="na">class</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">privateConstructor</span><span class="p">.</span><span class="na">setAccessible</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span><span class="w"> </span><span class="c1">// 关闭访问检查</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">User</span><span class="w"> </span><span class="n">user2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">privateConstructor</span><span class="p">.</span><span class="na">newInstance</span><span class="p">(</span><span class="s">&#34;李四&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">20</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;私有构造创建：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">user2</span><span class="p">.</span><span class="na">getName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h3 id="获取构造器的方法">
<a class="header-anchor" href="#%e8%8e%b7%e5%8f%96%e6%9e%84%e9%80%a0%e5%99%a8%e7%9a%84%e6%96%b9%e6%b3%95"></a>
获取构造器的方法
</h3><p>获取类的所有构造器信息：
<strong>1.<code>Constructor&lt;?&gt;[] getConstructors()</code>：获取所有 public 构造器</strong>
<strong>2.<code>Constructor&lt;?&gt;[] getDeclaredConstructors()</code>：获取所有构造器（包括 private、protected、default）</strong></p>
<p>代码示例：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">java.lang.reflect.Constructor</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">ClassGetConstructorsDemo</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Class</span><span class="o">&lt;</span><span class="n">User</span><span class="o">&gt;</span><span class="w"> </span><span class="n">userClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">User</span><span class="p">.</span><span class="na">class</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;所有public构造器：&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Constructor</span><span class="o">&lt;?&gt;[]</span><span class="w"> </span><span class="n">publicConstructors</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">userClass</span><span class="p">.</span><span class="na">getConstructors</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Constructor</span><span class="o">&lt;?&gt;</span><span class="w"> </span><span class="n">constructor</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">publicConstructors</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;- &#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">constructor</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;\n所有构造器（包括私有）：&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Constructor</span><span class="o">&lt;?&gt;[]</span><span class="w"> </span><span class="n">allConstructors</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">userClass</span><span class="p">.</span><span class="na">getDeclaredConstructors</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Constructor</span><span class="o">&lt;?&gt;</span><span class="w"> </span><span class="n">constructor</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">allConstructors</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;- &#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">constructor</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h3 id="获取成员变量的方法">
<a class="header-anchor" href="#%e8%8e%b7%e5%8f%96%e6%88%90%e5%91%98%e5%8f%98%e9%87%8f%e7%9a%84%e6%96%b9%e6%b3%95"></a>
获取成员变量的方法
</h3><p>获取类的所有属性信息：
<strong>1.<code>Field[] getFields()</code>：获取所有 public 属性</strong>
<strong>2.<code>Field[] getDeclaredFields()</code>：获取所有属性（包括 private）</strong>
<strong>3.<code>Field getField(String name)</code>：获取指定名称的 public 属性</strong>
<strong>4.<code>Field getDeclaredField(String name)</code>：获取指定名称的任意属性（包括 private）</strong></p>
<p>代码示例：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">java.lang.reflect.Field</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">ClassGetFieldsDemo</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="kd">throws</span><span class="w"> </span><span class="n">Exception</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Class</span><span class="o">&lt;</span><span class="n">User</span><span class="o">&gt;</span><span class="w"> </span><span class="n">userClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">User</span><span class="p">.</span><span class="na">class</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">User</span><span class="w"> </span><span class="n">user</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">userClass</span><span class="p">.</span><span class="na">getConstructor</span><span class="p">().</span><span class="na">newInstance</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 获取并操作private属性</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Field</span><span class="w"> </span><span class="n">nameField</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">userClass</span><span class="p">.</span><span class="na">getDeclaredField</span><span class="p">(</span><span class="s">&#34;name&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">nameField</span><span class="p">.</span><span class="na">setAccessible</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">nameField</span><span class="p">.</span><span class="na">set</span><span class="p">(</span><span class="n">user</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;王五&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;name属性值：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">nameField</span><span class="p">.</span><span class="na">get</span><span class="p">(</span><span class="n">user</span><span class="p">));</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h3 id="获取成员方法的方法">
<a class="header-anchor" href="#%e8%8e%b7%e5%8f%96%e6%88%90%e5%91%98%e6%96%b9%e6%b3%95%e7%9a%84%e6%96%b9%e6%b3%95"></a>
获取成员方法的方法
</h3><p>获取类的所有方法信息：
<strong>1.<code>Method[] getMethods()</code>：获取所有 public 方法（包括父类继承的）</strong>
<strong>2.<code>Method[] getDeclaredMethods()</code>：获取本类所有方法（包括 private，不包括继承的</strong>
<strong>3.<code>Method getMethod(String name, Class&lt;?&gt;... parameterTypes)</code>：获取指定名称和参数的 public 方法</strong>
<strong>4.<code>Method getDeclaredMethod(String name, Class&lt;?&gt;... parameterTypes)</code>：获取指定名称和参数的任意方法（包括 private）</strong></p>
<p>代码示例：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">java.lang.reflect.Method</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">ClassGetMethodsDemo</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="kd">throws</span><span class="w"> </span><span class="n">Exception</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Class</span><span class="o">&lt;</span><span class="n">User</span><span class="o">&gt;</span><span class="w"> </span><span class="n">userClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">User</span><span class="p">.</span><span class="na">class</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">User</span><span class="w"> </span><span class="n">user</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">userClass</span><span class="p">.</span><span class="na">getDeclaredConstructor</span><span class="p">(</span><span class="n">String</span><span class="p">.</span><span class="na">class</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="p">.</span><span class="na">class</span><span class="p">).</span><span class="na">newInstance</span><span class="p">(</span><span class="s">&#34;赵六&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">22</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">user</span><span class="p">.</span><span class="na">setAccessible</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 调用public方法</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Method</span><span class="w"> </span><span class="n">sayHelloMethod</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">userClass</span><span class="p">.</span><span class="na">getMethod</span><span class="p">(</span><span class="s">&#34;sayHello&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">sayHelloMethod</span><span class="p">.</span><span class="na">invoke</span><span class="p">(</span><span class="n">user</span><span class="p">);</span><span class="w"> </span><span class="c1">// 输出：Hello, 赵六</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 调用private方法</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Method</span><span class="w"> </span><span class="n">getSecretMethod</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">userClass</span><span class="p">.</span><span class="na">getDeclaredMethod</span><span class="p">(</span><span class="s">&#34;getSecret&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">getSecretMethod</span><span class="p">.</span><span class="na">setAccessible</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">String</span><span class="w"> </span><span class="n">secret</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">String</span><span class="p">)</span><span class="w"> </span><span class="n">getSecretMethod</span><span class="p">.</span><span class="na">invoke</span><span class="p">(</span><span class="n">user</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;私有方法返回值：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">secret</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h3 id="获取类基本信息的方法">
<a class="header-anchor" href="#%e8%8e%b7%e5%8f%96%e7%b1%bb%e5%9f%ba%e6%9c%ac%e4%bf%a1%e6%81%af%e7%9a%84%e6%96%b9%e6%b3%95"></a>
获取类基本信息的方法
</h3><p>获取类的元数据信息：
<strong>1.<code>String getName()</code>：获取全类名（包名 + 类名）</strong>
<strong>2.<code>String getSimpleName()</code>：获取简单类名</strong>
<strong>3.<code>Package getPackage()</code>：获取包信息</strong>
<strong>4.<code>Class&lt;? super T&gt; getSuperclass()</code>：获取父类 Class 对象</strong>
<strong>5.<code>Class&lt;?&gt;[] getInterfaces()</code>：获取实现的所有接口</strong>
<strong>6.<code>boolean isInterface()</code>：是否是接口</strong>
<strong>7.<code>boolean isArray()</code>：是否是数组</strong>
<strong>8.<code>boolean isPrimitive()</code>：是否是基本数据类型</strong></p>
<p>代码示例：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">ClassInfoDemo</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Class</span><span class="o">&lt;</span><span class="n">User</span><span class="o">&gt;</span><span class="w"> </span><span class="n">userClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">User</span><span class="p">.</span><span class="na">class</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;全类名：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">userClass</span><span class="p">.</span><span class="na">getName</span><span class="p">());</span><span class="w"> </span><span class="c1">// com.example.User</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;简单类名：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">userClass</span><span class="p">.</span><span class="na">getSimpleName</span><span class="p">());</span><span class="w"> </span><span class="c1">// User</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;包名：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">userClass</span><span class="p">.</span><span class="na">getPackage</span><span class="p">().</span><span class="na">getName</span><span class="p">());</span><span class="w"> </span><span class="c1">// com.example</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;父类：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">userClass</span><span class="p">.</span><span class="na">getSuperclass</span><span class="p">().</span><span class="na">getName</span><span class="p">());</span><span class="w"> </span><span class="c1">// java.lang.Object</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;是否是接口：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">userClass</span><span class="p">.</span><span class="na">isInterface</span><span class="p">());</span><span class="w"> </span><span class="c1">// false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;是否是数组：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">userClass</span><span class="p">.</span><span class="na">isArray</span><span class="p">());</span><span class="w"> </span><span class="c1">// false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h2 id="注意事项">
<a class="header-anchor" href="#%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9"></a>
注意事项：
</h2><ul>
<li>
<p><strong><code>Class.forName()</code> 会触发静态初始化</strong></p>
<ul>
<li>如果类中有静态代码块，<code>Class.forName()</code> 会执行它</li>
<li><code>类名.class</code> 和 <code>对象.getClass()</code> 不会执行静态代码块</li>
</ul>
</li>
<li>
<p><strong>基本数据类型的 Class 对象</strong></p>
<ul>
<li>基本数据类型也有对应的 Class 对象：<code>int.class</code>、<code>boolean.class</code></li>
<li>它们的包装类有一个 <code>TYPE</code> 常量，指向对应的基本类型 Class 对象：<code>Integer.TYPE == int.class</code></li>
</ul>
</li>
<li>
<p><strong>数组的 Class 对象</strong></p>
<ul>
<li>数组的 Class 对象是 <code>元素类型[].class</code>：<code>String[].class</code>、<code>int[].class</code></li>
<li>所有同类型同维度的数组共享同一个 Class 对象</li>
</ul>
</li>
<li>
<p><strong><code>newInstance()</code> 方法已废弃</strong></p>
<ul>
<li>JDK9 之后，<code>Class.newInstance()</code> 被废弃，因为它会传播未检查的异常</li>
<li>推荐使用 <code>Constructor.newInstance()</code> 方法创建对象</li>
</ul>
</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">java.lang.reflect.Constructor</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">Class</span><span class="o">&lt;</span><span class="n">User</span><span class="o">&gt;</span><span class="w"> </span><span class="n">userClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">User</span><span class="p">.</span><span class="na">class</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// ✅ 调用者是 Class 对象 → 执行 Class.newInstance()</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">User</span><span class="w"> </span><span class="n">user1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">userClass</span><span class="p">.</span><span class="na">newInstance</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// ✅ 调用者是 Constructor 对象 → 执行 Constructor.newInstance()</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">Constructor</span><span class="o">&lt;</span><span class="n">User</span><span class="o">&gt;</span><span class="w"> </span><span class="n">constructor</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">userClass</span><span class="p">.</span><span class="na">getConstructor</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">User</span><span class="w"> </span><span class="n">user2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">constructor</span><span class="p">.</span><span class="na">newInstance</span><span class="p">();</span><span class="w">
</span></span></span></code></pre></div><h1 id="获取-class-类对象">
<a class="header-anchor" href="#%e8%8e%b7%e5%8f%96-class-%e7%b1%bb%e5%af%b9%e8%b1%a1"></a>
获取 Class 类对象
</h1><h2 id="哪些类型有-class-对象">
<a class="header-anchor" href="#%e5%93%aa%e4%ba%9b%e7%b1%bb%e5%9e%8b%e6%9c%89-class-%e5%af%b9%e8%b1%a1"></a>
哪些类型有 Class 对象？
</h2><p><strong>Java 中几乎所有类型都有对应的 Class 对象</strong>，JVM 会为每一种类型在内存中生成唯一的 Class 实例。具体包括以下 8 大类：</p>
<table>
  <thead>
      <tr>
          <th style="text-align: left">类型分类</th>
          <th style="text-align: left">示例</th>
          <th style="text-align: left">Class 对象写法</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: left">普通类</td>
          <td style="text-align: left">User、String、ArrayList</td>
          <td style="text-align: left">User.class</td>
      </tr>
      <tr>
          <td style="text-align: left">接口</td>
          <td style="text-align: left">List、Runnable、Serializable</td>
          <td style="text-align: left">List.class</td>
      </tr>
      <tr>
          <td style="text-align: left">数组</td>
          <td style="text-align: left">int[]、String[]、User[][]</td>
          <td style="text-align: left">int[].class、String[][].class</td>
      </tr>
      <tr>
          <td style="text-align: left">基本数据类型</td>
          <td style="text-align: left">int、boolean、char、double</td>
          <td style="text-align: left">int.class、boolean.class</td>
      </tr>
      <tr>
          <td style="text-align: left">枚举</td>
          <td style="text-align: left">enum Color {RED, GREEN}</td>
          <td style="text-align: left">Color.class</td>
      </tr>
      <tr>
          <td style="text-align: left">注解</td>
          <td style="text-align: left">@Override、@Service</td>
          <td style="text-align: left">Override.class</td>
      </tr>
      <tr>
          <td style="text-align: left">泛型参数</td>
          <td style="text-align: left">T、E</td>
          <td style="text-align: left">无法直接获取，通过反射间接获取</td>
      </tr>
      <tr>
          <td style="text-align: left">void</td>
          <td style="text-align: left">无返回值</td>
          <td style="text-align: left">void.class</td>
      </tr>
  </tbody>
</table>
<p><strong>关键验证：Class 对象的单例性</strong></p>
<blockquote>
<p><strong>同一个类型在同一个 JVM 中永远只有一个 Class 实例</strong>，无论用哪种方式获取，得到的都是同一个对象</p>
</blockquote>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">ClassSingletonDemo</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 验证普通类</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Class</span><span class="o">&lt;?&gt;</span><span class="w"> </span><span class="n">c1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">User</span><span class="p">.</span><span class="na">class</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Class</span><span class="o">&lt;?&gt;</span><span class="w"> </span><span class="n">c2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">User</span><span class="p">().</span><span class="na">getClass</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">c1</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">c2</span><span class="p">);</span><span class="w"> </span><span class="c1">// true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 验证数组</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Class</span><span class="o">&lt;?&gt;</span><span class="w"> </span><span class="n">arr1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kt">int</span><span class="o">[]</span><span class="p">.</span><span class="na">class</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Class</span><span class="o">&lt;?&gt;</span><span class="w"> </span><span class="n">arr2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="kt">int</span><span class="o">[</span><span class="n">10</span><span class="o">]</span><span class="p">.</span><span class="na">getClass</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">arr1</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">arr2</span><span class="p">);</span><span class="w"> </span><span class="c1">// true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 验证基本数据类型</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="kt">int</span><span class="p">.</span><span class="na">class</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kt">int</span><span class="p">.</span><span class="na">class</span><span class="p">);</span><span class="w"> </span><span class="c1">// true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">class</span> <span class="nc">User</span><span class="w"> </span><span class="p">{}</span><span class="w">
</span></span></span></code></pre></div><h2 id="获取-class-对象的-3-种核心方法">
<a class="header-anchor" href="#%e8%8e%b7%e5%8f%96-class-%e5%af%b9%e8%b1%a1%e7%9a%84-3-%e7%a7%8d%e6%a0%b8%e5%bf%83%e6%96%b9%e6%b3%95"></a>
获取 Class 对象的 3 种核心方法
</h2><p><strong>方法 1：<code>Class.forName(String 全类名)</code></strong>
<strong>最灵活、框架首选</strong>的方式，编译期不需要依赖类，运行期动态加载。</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="n">Class</span><span class="o">&lt;?&gt;</span><span class="w"> </span><span class="n">clazz</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Class</span><span class="p">.</span><span class="na">forName</span><span class="p">(</span><span class="s">&#34;包名.类名&#34;</span><span class="p">);</span><span class="w">
</span></span></span></code></pre></div><h3 id="核心特点">
<a class="header-anchor" href="#%e6%a0%b8%e5%bf%83%e7%89%b9%e7%82%b9"></a>
核心特点
</h3><ol>
<li><strong>会触发类的完整初始化</strong>：执行静态代码块、静态变量赋值</li>
<li><strong>编译期不依赖类</strong>：只要运行时类存在即可，是框架实现可扩展性的核心</li>
<li><strong>抛出检查异常</strong>：<code>ClassNotFoundException</code>（类不存在时）</li>
</ol>
<h3 id="适用场景">
<a class="header-anchor" href="#%e9%80%82%e7%94%a8%e5%9c%ba%e6%99%af"></a>
适用场景
</h3><ul>
<li>框架底层动态加载类（Spring IOC、MyBatis、JDBC）</li>
<li>配置文件中指定类名，运行时动态创建对象</li>
<li>插件化开发
<strong>代码示例</strong>：</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">ForNameDemo</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">try</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="c1">// 1. 加载普通类</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">Class</span><span class="o">&lt;?&gt;</span><span class="w"> </span><span class="n">userClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Class</span><span class="p">.</span><span class="na">forName</span><span class="p">(</span><span class="s">&#34;com.example.User&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;加载User类成功：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">userClass</span><span class="p">.</span><span class="na">getName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="c1">// 2. JDBC 加载驱动（经典应用）</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">Class</span><span class="p">.</span><span class="na">forName</span><span class="p">(</span><span class="s">&#34;com.mysql.cj.jdbc.Driver&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;MySQL驱动加载成功&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">ClassNotFoundException</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">err</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;类不存在：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">e</span><span class="p">.</span><span class="na">getMessage</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// 验证静态代码块执行</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">class</span> <span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">static</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;User类的静态代码块执行了&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p><strong>方法 2：<code>类名.class</code></strong>
<strong>最安全、性能最高</strong>的方式，编译期就确定了 Class 对象。
语法：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="n">Class</span><span class="o">&lt;</span><span class="n">User</span><span class="o">&gt;</span><span class="w"> </span><span class="n">userClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">User</span><span class="p">.</span><span class="na">class</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">Class</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;</span><span class="w"> </span><span class="n">intClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kt">int</span><span class="p">.</span><span class="na">class</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">Class</span><span class="o">&lt;</span><span class="n">List</span><span class="o">&gt;</span><span class="w"> </span><span class="n">listClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">List</span><span class="p">.</span><span class="na">class</span><span class="p">;</span><span class="w">
</span></span></span></code></pre></div><h3 id="核心特点-1">
<a class="header-anchor" href="#%e6%a0%b8%e5%bf%83%e7%89%b9%e7%82%b9-1"></a>
核心特点
</h3><ol>
<li><strong>不会触发类的初始化</strong>：不执行静态代码块，性能最好</li>
<li><strong>编译期类型检查</strong>：如果类不存在，编译直接报错，更安全</li>
<li><strong>支持泛型</strong>：可以得到带泛型的 Class 对象，避免类型转换</li>
</ol>
<h3 id="适用场景-1">
<a class="header-anchor" href="#%e9%80%82%e7%94%a8%e5%9c%ba%e6%99%af-1"></a>
适用场景
</h3><ul>
<li>方法参数传递（比如获取方法的参数类型、返回值类型）</li>
<li>已知类名的情况下，优先使用这种方式</li>
<li>基本数据类型只能用这种方式获取 Class 对象
<strong>代码示例</strong>：</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">ClassLiteralDemo</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 1. 普通类</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Class</span><span class="o">&lt;</span><span class="n">User</span><span class="o">&gt;</span><span class="w"> </span><span class="n">userClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">User</span><span class="p">.</span><span class="na">class</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;User类：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">userClass</span><span class="p">.</span><span class="na">getSimpleName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 2. 基本数据类型（只能用这种方式）</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Class</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;</span><span class="w"> </span><span class="n">intClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kt">int</span><span class="p">.</span><span class="na">class</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;int类型：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">intClass</span><span class="p">.</span><span class="na">getName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 3. 接口</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Class</span><span class="o">&lt;</span><span class="n">Runnable</span><span class="o">&gt;</span><span class="w"> </span><span class="n">runnableClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Runnable</span><span class="p">.</span><span class="na">class</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;Runnable接口：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">runnableClass</span><span class="p">.</span><span class="na">getName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 4. 数组</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Class</span><span class="o">&lt;</span><span class="n">String</span><span class="o">[]&gt;</span><span class="w"> </span><span class="n">stringArrayClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">String</span><span class="o">[]</span><span class="p">.</span><span class="na">class</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;String数组：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">stringArrayClass</span><span class="p">.</span><span class="na">getName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 5. void</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Class</span><span class="o">&lt;</span><span class="n">Void</span><span class="o">&gt;</span><span class="w"> </span><span class="n">voidClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kt">void</span><span class="p">.</span><span class="na">class</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;void类型：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">voidClass</span><span class="p">.</span><span class="na">getName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p><strong>方法 3：<code>对象.getClass()</code></strong>
<strong>已有对象时使用</strong>，可以获取对象的<strong>实际运行时类型</strong>（适配多态）。
语法：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="n">Object</span><span class="w"> </span><span class="n">obj</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">User</span><span class="p">();</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">Class</span><span class="o">&lt;?&gt;</span><span class="w"> </span><span class="n">clazz</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">obj</span><span class="p">.</span><span class="na">getClass</span><span class="p">();</span><span class="w">
</span></span></span></code></pre></div><h3 id="核心特点-2">
<a class="header-anchor" href="#%e6%a0%b8%e5%bf%83%e7%89%b9%e7%82%b9-2"></a>
核心特点
</h3><ol>
<li><strong>获取的是对象的实际运行类</strong>，不是声明的类型（多态场景下非常重要）</li>
<li><strong>不会触发类的初始化</strong>（因为对象已经创建了）</li>
<li><strong>只能用于引用类型</strong>，基本数据类型不能使用</li>
</ol>
<h3 id="适用场景-2">
<a class="header-anchor" href="#%e9%80%82%e7%94%a8%e5%9c%ba%e6%99%af-2"></a>
适用场景
</h3><ul>
<li>多态场景下，获取对象的真实类型</li>
<li>已有对象实例，需要获取其 Class 对象
<strong>代码示例：</strong></li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">GetClassDemo</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 声明类型是 Animal，实际类型是 Dog</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Animal</span><span class="w"> </span><span class="n">animal</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Dog</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// getClass() 返回实际运行时的类 Dog.class</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Class</span><span class="o">&lt;?&gt;</span><span class="w"> </span><span class="n">clazz</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">animal</span><span class="p">.</span><span class="na">getClass</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;对象的实际类型：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">clazz</span><span class="p">.</span><span class="na">getName</span><span class="p">());</span><span class="w"> </span><span class="c1">// com.example.Dog</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 对比：类名.class 返回声明的类型 Animal.class</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;声明的类型：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">Animal</span><span class="p">.</span><span class="na">class</span><span class="p">.</span><span class="na">getName</span><span class="p">());</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// com.example.Animal</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">class</span> <span class="nc">Animal</span><span class="w"> </span><span class="p">{}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">class</span> <span class="nc">Dog</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">Animal</span><span class="w"> </span><span class="p">{}</span><span class="w">
</span></span></span></code></pre></div><h3 id="3-种方法对比与选型">
<a class="header-anchor" href="#3-%e7%a7%8d%e6%96%b9%e6%b3%95%e5%af%b9%e6%af%94%e4%b8%8e%e9%80%89%e5%9e%8b"></a>
3 种方法对比与选型
</h3><table>
  <thead>
      <tr>
          <th style="text-align: left">对比维度</th>
          <th style="text-align: left"><code>Class.forName()</code></th>
          <th style="text-align: left"><code>类名.class</code></th>
          <th style="text-align: left"><code>对象.getClass()</code></th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: left">触发初始化</td>
          <td style="text-align: left">✅ 是</td>
          <td style="text-align: left">❌ 否</td>
          <td style="text-align: left">❌ 否</td>
      </tr>
      <tr>
          <td style="text-align: left">编译期检查</td>
          <td style="text-align: left">❌ 否（运行时才检查）</td>
          <td style="text-align: left">✅ 是</td>
          <td style="text-align: left">✅ 是</td>
      </tr>
      <tr>
          <td style="text-align: left">性能</td>
          <td style="text-align: left">最低</td>
          <td style="text-align: left">最高</td>
          <td style="text-align: left">高</td>
      </tr>
      <tr>
          <td style="text-align: left">灵活性</td>
          <td style="text-align: left">最高</td>
          <td style="text-align: left">最低</td>
          <td style="text-align: left">中等</td>
      </tr>
      <tr>
          <td style="text-align: left">适用场景</td>
          <td style="text-align: left">框架动态加载、插件化</td>
          <td style="text-align: left">已知类名、参数传递</td>
          <td style="text-align: left">已有对象、多态场景</td>
      </tr>
  </tbody>
</table>
<h3 id="特殊场景下的-class-对象获取">
<a class="header-anchor" href="#%e7%89%b9%e6%ae%8a%e5%9c%ba%e6%99%af%e4%b8%8b%e7%9a%84-class-%e5%af%b9%e8%b1%a1%e8%8e%b7%e5%8f%96"></a>
特殊场景下的 Class 对象获取
</h3><p><strong>1. 基本数据类型 vs 包装类的 Class 对象</strong>
基本数据类型和其包装类的 Class 对象是不同的</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">PrimitiveVsWrapperDemo</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 基本数据类型</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Class</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;</span><span class="w"> </span><span class="n">intClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kt">int</span><span class="p">.</span><span class="na">class</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 包装类</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Class</span><span class="o">&lt;</span><span class="n">Integer</span><span class="o">&gt;</span><span class="w"> </span><span class="n">integerClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Integer</span><span class="p">.</span><span class="na">class</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">intClass</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">integerClass</span><span class="p">);</span><span class="w"> </span><span class="c1">// false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 包装类的 TYPE 常量指向对应的基本类型 Class 对象</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">intClass</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">Integer</span><span class="p">.</span><span class="na">TYPE</span><span class="p">);</span><span class="w"> </span><span class="c1">// true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="kt">boolean</span><span class="p">.</span><span class="na">class</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">Boolean</span><span class="p">.</span><span class="na">TYPE</span><span class="p">);</span><span class="w"> </span><span class="c1">// true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p><strong>2. 数组的 Class 对象</strong></p>
<ul>
<li>所有<strong>同类型、同维度</strong>的数组共享同一个 Class 对象</li>
<li>不同维度的数组，Class 对象不同</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">ArrayClassDemo</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="kt">int</span><span class="o">[]</span><span class="w"> </span><span class="n">arr1</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="kt">int</span><span class="o">[</span><span class="n">10</span><span class="o">]</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="kt">int</span><span class="o">[]</span><span class="w"> </span><span class="n">arr2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="kt">int</span><span class="o">[</span><span class="n">100</span><span class="o">]</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="kt">int</span><span class="o">[][]</span><span class="w"> </span><span class="n">arr3</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="kt">int</span><span class="o">[</span><span class="n">5</span><span class="o">][</span><span class="n">5</span><span class="o">]</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">arr1</span><span class="p">.</span><span class="na">getClass</span><span class="p">()</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">arr2</span><span class="p">.</span><span class="na">getClass</span><span class="p">());</span><span class="w"> </span><span class="c1">// true（同类型同维度）</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">arr1</span><span class="p">.</span><span class="na">getClass</span><span class="p">()</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">arr3</span><span class="p">.</span><span class="na">getClass</span><span class="p">());</span><span class="w"> </span><span class="c1">// false（不同维度）</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p><strong>3.匿名内部类的 Class 对象</strong>
匿名内部类也有对应的 Class 对象，类名格式为 <code>外部类名$数字</code>：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">AnonymousClassDemo</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Runnable</span><span class="w"> </span><span class="n">runnable</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Runnable</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="nd">@Override</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">run</span><span class="p">()</span><span class="w"> </span><span class="p">{}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">};</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">runnable</span><span class="p">.</span><span class="na">getClass</span><span class="p">().</span><span class="na">getName</span><span class="p">());</span><span class="w"> 
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 输出：com.example.AnonymousClassDemo$1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h3 id="常见坑与注意事项">
<a class="header-anchor" href="#%e5%b8%b8%e8%a7%81%e5%9d%91%e4%b8%8e%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9"></a>
常见坑与注意事项
</h3><ul>
<li><strong><code>Class.forName()</code> 必须写全类名</strong>（包名 + 类名），否则会报 <code>ClassNotFoundException</code></li>
<li><strong>基本数据类型只能用 <code>类名.class</code> 获取 Class 对象</strong>，不能用 <code>Class.forName()</code> 或 <code>对象.getClass()</code></li>
<li><strong><code>getClass()</code> 返回的是实际运行时类型</strong>，不是声明的类型，多态场景下要特别注意</li>
<li><strong>数组的 Class 对象与元素类型和维度都有关</strong>，不同维度的数组 Class 对象不同</li>
<li><strong>Class 对象是单例的</strong>，可以用 <code>==</code> 比较两个 Class 对象是否相等</li>
</ul>
<h1 id="类加载">
<a class="header-anchor" href="#%e7%b1%bb%e5%8a%a0%e8%bd%bd"></a>
类加载
</h1><h2 id="类加载的基本介绍">
<a class="header-anchor" href="#%e7%b1%bb%e5%8a%a0%e8%bd%bd%e7%9a%84%e5%9f%ba%e6%9c%ac%e4%bb%8b%e7%bb%8d"></a>
类加载的基本介绍
</h2><p><strong>什么是类加载？</strong>
JVM 在<strong>第一次使用某个类时</strong>，会将该类的<code>.class</code>字节码文件从磁盘（或网络、内存等）读取到内存中，并对其进行<strong>验证、准备、解析、初始化</strong>，最终生成一个可以被程序使用的<code>Class</code>对象。这个完整的过程，就是类加载。</p>
<p><strong>核心特点</strong>：</p>
<ul>
<li><strong>按需加载</strong>：JVM 不会一次性加载所有类，只有在<strong>第一次使用</strong>时才会加载</li>
<li><strong>一次加载，终身复用</strong>：一个类在 JVM 的生命周期中只会被加载一次，生成的<code>Class</code>对象会被缓存起来</li>
<li><strong>可扩展</strong>：通过自定义类加载器，可以实现从任意来源加载类（如网络、加密文件、动态生成的字节码）</li>
</ul>
<p><strong>类加载与反射的关系</strong>
反射的本质是<strong>操作 JVM 加载后生成的<code>Class</code>对象</strong>。如果一个类没有被 JVM 加载，就无法获取它的<code>Class</code>对象，也就无法进行任何反射操作。</p>
<h2 id="类加载的时机">
<a class="header-anchor" href="#%e7%b1%bb%e5%8a%a0%e8%bd%bd%e7%9a%84%e6%97%b6%e6%9c%ba"></a>
类加载的时机
</h2><blockquote>
<p>JVM 只有在<strong>主动引用</strong>一个类时，才会触发类的<strong>初始化</strong>（类加载的最后一个阶段）。如果是<strong>被动引用</strong>，则不会触发类的初始化。</p>
</blockquote>
<h3 id="1-主动引用一定会触发类加载">
<a class="header-anchor" href="#1-%e4%b8%bb%e5%8a%a8%e5%bc%95%e7%94%a8%e4%b8%80%e5%ae%9a%e4%bc%9a%e8%a7%a6%e5%8f%91%e7%b1%bb%e5%8a%a0%e8%bd%bd"></a>
1. 主动引用（一定会触发类加载）
</h3><p>以下 6 种情况属于主动引用，JVM 会立即加载并初始化该类：</p>
<ol>
<li><strong>创建类的实例</strong>：<code>new User()</code></li>
<li><strong>调用类的静态成员</strong>：访问或修改静态变量、调用静态方法</li>
<li><strong>使用反射</strong>：<code>Class.forName(&quot;com.example.User&quot;)</code></li>
<li><strong>初始化子类</strong>：初始化子类时，会先初始化其父类</li>
<li><strong>启动类</strong>：执行<code>main()</code>方法的类</li>
<li><strong>JDK 8+ 接口默认方法</strong>：如果一个接口定义了默认方法，那么实现该接口的类初始化时，会先初始化该接口</li>
</ol>
<h3 id="2-被动引用不会触发类加载">
<a class="header-anchor" href="#2-%e8%a2%ab%e5%8a%a8%e5%bc%95%e7%94%a8%e4%b8%8d%e4%bc%9a%e8%a7%a6%e5%8f%91%e7%b1%bb%e5%8a%a0%e8%bd%bd"></a>
2. 被动引用（不会触发类加载）
</h3><p>以下 3 种情况属于被动引用，JVM 不会触发类的初始化：</p>
<ol>
<li><strong>通过子类引用父类的静态变量</strong>：只会初始化父类，不会初始化子类</li>
<li><strong>定义类的数组</strong>：<code>User[] users = new User[10];</code> 只会初始化数组本身，不会初始化<code>User</code>类</li>
<li><strong>引用类的常量</strong>：常量在编译阶段会被存入调用类的常量池，本质上没有直接引用定义常量的类</li>
</ol>
<p><strong>代码示例：主动引用 vs 被动引用</strong>：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">ClassLoadTimingDemo</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 被动引用1：通过子类引用父类的静态变量</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 只会输出&#34;父类初始化&#34;，不会输出&#34;子类初始化&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">Child</span><span class="p">.</span><span class="na">parentStaticVar</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 被动引用2：定义类的数组</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 不会输出任何初始化信息</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">User</span><span class="o">[]</span><span class="w"> </span><span class="n">users</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">User</span><span class="o">[</span><span class="n">10</span><span class="o">]</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 被动引用3：引用类的常量</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 不会输出&#34;常量类初始化&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">ConstantClass</span><span class="p">.</span><span class="na">CONSTANT</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 主动引用：创建对象</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 会输出&#34;User类初始化&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">User</span><span class="w"> </span><span class="n">user</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">User</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">class</span> <span class="nc">Parent</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">parentStaticVar</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">100</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">static</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;父类初始化&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">class</span> <span class="nc">Child</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">Parent</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">static</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;子类初始化&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">class</span> <span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">static</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;User类初始化&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">class</span> <span class="nc">ConstantClass</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">CONSTANT</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&#34;hello&#34;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">static</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;常量类初始化&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h2 id="类加载的完整过程">
<a class="header-anchor" href="#%e7%b1%bb%e5%8a%a0%e8%bd%bd%e7%9a%84%e5%ae%8c%e6%95%b4%e8%bf%87%e7%a8%8b"></a>
类加载的完整过程
</h2><blockquote>
<p>类加载分为<strong>5 个连续的阶段</strong>，其中前 4 个阶段（加载、验证、准备、解析）称为<strong>连接阶段</strong>，最后一个阶段是<strong>初始化阶段</strong>。</p>
</blockquote>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">类加载流程：
</span></span><span class="line"><span class="cl">加载 → 验证 → 准备 → 解析 → 初始化
</span></span><span class="line"><span class="cl">└────────── 连接阶段 ─┘
</span></span></code></pre></div><h3 id="阶段-1加载loading">
<a class="header-anchor" href="#%e9%98%b6%e6%ae%b5-1%e5%8a%a0%e8%bd%bdloading"></a>
阶段 1：加载（Loading）
</h3><p><strong>核心任务</strong>：找到字节码文件，读取到内存，生成<code>Class</code>对象。</p>
<h4 id="具体完成-3-件事">
<a class="header-anchor" href="#%e5%85%b7%e4%bd%93%e5%ae%8c%e6%88%90-3-%e4%bb%b6%e4%ba%8b"></a>
具体完成 3 件事：
</h4><ol>
<li><strong>获取字节码</strong>：通过类的<strong>全限定名</strong>（包名 + 类名），找到对应的<code>.class</code>字节码文件
<ul>
<li>字节码来源：本地磁盘、网络（如 Tomcat 加载 war 包）、动态生成（如 ASM、CGLIB）、加密文件</li>
</ul>
</li>
<li><strong>转化数据结构</strong>：将字节码的<strong>静态二进制结构</strong>，转化为方法区的<strong>运行时数据结构</strong></li>
<li><strong>生成 Class 对象</strong>：在堆内存中生成一个对应的<code>java.lang.Class</code>对象，作为方法区中类数据的访问入口</li>
</ol>
<h4 id="关键说明">
<a class="header-anchor" href="#%e5%85%b3%e9%94%ae%e8%af%b4%e6%98%8e"></a>
关键说明：
</h4><ul>
<li>加载阶段由 <strong>类加载器（ClassLoader）</strong> 完成</li>
<li>加载阶段和连接阶段是交叉进行的，加载阶段还没结束，连接阶段可能已经开始</li>
<li>数组类的加载比较特殊：数组类本身由 JVM 直接创建，其元素类型由类加载器加载</li>
</ul>
<h3 id="阶段-2验证verification">
<a class="header-anchor" href="#%e9%98%b6%e6%ae%b5-2%e9%aa%8c%e8%af%81verification"></a>
阶段 2：验证（Verification）
</h3><p><strong>核心任务</strong>：确保字节码文件的正确性，防止恶意代码攻击 JVM。
这是 JVM 的安全屏障，确保加载的字节码符合 JVM 规范，不会导致 JVM 崩溃。</p>
<h4 id="验证分为-4-个步骤">
<a class="header-anchor" href="#%e9%aa%8c%e8%af%81%e5%88%86%e4%b8%ba-4-%e4%b8%aa%e6%ad%a5%e9%aa%a4"></a>
验证分为 4 个步骤：
</h4><ol>
<li>
<p><strong>文件格式验证</strong>：验证字节码文件的格式是否符合规范</p>
<ul>
<li>检查魔数（<code>0xCAFEBABE</code>）、版本号、常量池格式等</li>
</ul>
</li>
<li>
<p><strong>元数据验证</strong>：验证类的元数据信息是否符合 Java 语法规范</p>
<ul>
<li>检查类是否有父类、是否继承了不允许继承的类（如<code>final</code>类）、方法和字段是否符合语法</li>
</ul>
</li>
<li>
<p><strong>字节码验证</strong>：最复杂的一步，验证方法的字节码逻辑是否合法</p>
<ul>
<li>检查操作数栈的类型是否正确、跳转指令是否指向正确的位置、类型转换是否合法</li>
</ul>
</li>
<li>
<p><strong>符号引用验证</strong>：验证常量池中的符号引用是否存在且合法</p>
<ul>
<li>检查符号引用指向的类、方法、字段是否存在，访问权限是否合法</li>
</ul>
</li>
</ol>
<h3 id="阶段-3准备preparation">
<a class="header-anchor" href="#%e9%98%b6%e6%ae%b5-3%e5%87%86%e5%a4%87preparation"></a>
阶段 3：准备（Preparation）
</h3><p><strong>核心任务</strong>：为<strong>类的静态变量</strong>分配内存，并设置<strong>默认初始值</strong>。</p>
<h4 id="关键细节">
<a class="header-anchor" href="#%e5%85%b3%e9%94%ae%e7%bb%86%e8%8a%82"></a>
关键细节：
</h4><ol>
<li><strong>只处理静态变量</strong>：实例变量的内存分配是在对象创建时（堆中）进行的</li>
<li><strong>设置默认初始值</strong>：不是代码中写的初始值，而是 JVM 规定的默认值</li>
<li><strong><code>final</code>修饰的静态常量</strong>：在准备阶段就会被赋值为代码中写的初始值（因为常量在编译期就确定了）</li>
</ol>
<table>
  <thead>
      <tr>
          <th style="text-align: left">类型</th>
          <th style="text-align: left">默认初始值</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: left">int</td>
          <td style="text-align: left">0</td>
      </tr>
      <tr>
          <td style="text-align: left">long</td>
          <td style="text-align: left">0L</td>
      </tr>
      <tr>
          <td style="text-align: left">float</td>
          <td style="text-align: left">0.0f</td>
      </tr>
      <tr>
          <td style="text-align: left">double</td>
          <td style="text-align: left">0.0d</td>
      </tr>
      <tr>
          <td style="text-align: left">boolean</td>
          <td style="text-align: left">false</td>
      </tr>
      <tr>
          <td style="text-align: left">char</td>
          <td style="text-align: left">&lsquo;\u0000&rsquo;</td>
      </tr>
      <tr>
          <td style="text-align: left">引用类型</td>
          <td style="text-align: left">null</td>
      </tr>
      <tr>
          <td style="text-align: left"><strong>代码示例：准备阶段 vs 初始化阶段的赋值</strong></td>
          <td style="text-align: left"></td>
      </tr>
  </tbody>
</table>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">PreparePhaseDemo</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// 准备阶段：分配内存，设置默认值0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// 初始化阶段：赋值为100</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">100</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// 准备阶段：直接赋值为200（final修饰的静态常量）</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">200</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">a</span><span class="p">);</span><span class="w"> </span><span class="c1">// 100</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">b</span><span class="p">);</span><span class="w"> </span><span class="c1">// 200</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h3 id="阶段-4解析resolution">
<a class="header-anchor" href="#%e9%98%b6%e6%ae%b5-4%e8%a7%a3%e6%9e%90resolution"></a>
阶段 4：解析（Resolution）
</h3><p><strong>核心任务</strong>：将常量池中的<strong>符号引用</strong>，转化为<strong>直接引用</strong>。</p>
<h4 id="核心概念">
<a class="header-anchor" href="#%e6%a0%b8%e5%bf%83%e6%a6%82%e5%bf%b5"></a>
核心概念：
</h4><ul>
<li><strong>符号引用</strong>：用一组字符串来描述所引用的目标，比如<code>com.example.User#sayHello()</code>
<ul>
<li>编译期无法确定目标的内存地址，只能用符号引用表示</li>
</ul>
</li>
<li><strong>直接引用</strong>：指向目标内存地址的指针、偏移量或句柄
<ul>
<li>解析后，JVM 可以直接通过直接引用找到目标</li>
</ul>
</li>
</ul>
<h4 id="解析的主要内容">
<a class="header-anchor" href="#%e8%a7%a3%e6%9e%90%e7%9a%84%e4%b8%bb%e8%a6%81%e5%86%85%e5%ae%b9"></a>
解析的主要内容：
</h4><ol>
<li>类或接口的解析</li>
<li>字段的解析</li>
<li>类方法的解析</li>
<li>接口方法的解析</li>
</ol>
<h4 id="关键说明-1">
<a class="header-anchor" href="#%e5%85%b3%e9%94%ae%e8%af%b4%e6%98%8e-1"></a>
关键说明：
</h4><ul>
<li>解析阶段可以在初始化阶段之后再执行（称为<strong>动态解析</strong>），这是 Java 实现动态绑定（多态）的基础</li>
<li>解析阶段只会执行一次，解析后的直接引用会被缓存起来</li>
</ul>
<h3 id="阶段-5初始化initialization">
<a class="header-anchor" href="#%e9%98%b6%e6%ae%b5-5%e5%88%9d%e5%a7%8b%e5%8c%96initialization"></a>
阶段 5：初始化（Initialization）
</h3><p><strong>核心任务</strong>：执行类的<strong>静态变量赋值语句</strong>和<strong>静态代码块</strong>，完成类的初始化。
这是类加载的最后一个阶段，也是我们最熟悉的阶段。</p>
<h4 id="核心执行逻辑">
<a class="header-anchor" href="#%e6%a0%b8%e5%bf%83%e6%89%a7%e8%a1%8c%e9%80%bb%e8%be%91"></a>
核心执行逻辑：
</h4><p>JVM 会自动生成一个<strong>类构造器方法<code>&lt;clinit&gt;()</code></strong>，初始化阶段就是执行这个方法的过程。
<code>&lt;clinit&gt;()</code>方法由编译器自动生成，包含：</p>
<ol>
<li>所有静态变量的赋值语句</li>
<li>所有静态代码块（<code>static{}</code>）中的代码</li>
</ol>
<h4 id="初始化的执行顺序">
<a class="header-anchor" href="#%e5%88%9d%e5%a7%8b%e5%8c%96%e7%9a%84%e6%89%a7%e8%a1%8c%e9%a1%ba%e5%ba%8f"></a>
初始化的执行顺序：
</h4><ol>
<li><strong>父类先初始化，子类后初始化</strong>：执行子类的<code>&lt;clinit&gt;()</code>方法前，会先执行父类的<code>&lt;clinit&gt;()</code>方法</li>
<li><strong>静态变量和静态代码块按顺序执行</strong>：在类中定义的顺序，就是执行的顺序</li>
<li><strong><code>&lt;clinit&gt;()</code>方法只会执行一次</strong>：JVM 会保证<code>&lt;clinit&gt;()</code>方法在多线程环境下被正确加锁和同步，确保一个类只会被初始化一次
<strong>代码示例：初始化顺序</strong></li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">InitializationOrderDemo</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">new</span><span class="w"> </span><span class="n">Son</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">class</span> <span class="nc">Father</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">static</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;父类静态代码块&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="nf">Father</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;父类构造方法&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">class</span> <span class="nc">Son</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">Father</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">static</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;子类静态代码块&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="nf">Son</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;子类构造方法&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h2 id="类加载各阶段任务总结">
<a class="header-anchor" href="#%e7%b1%bb%e5%8a%a0%e8%bd%bd%e5%90%84%e9%98%b6%e6%ae%b5%e4%bb%bb%e5%8a%a1%e6%80%bb%e7%bb%93"></a>
类加载各阶段任务总结
</h2><table>
  <thead>
      <tr>
          <th style="text-align: left">阶段</th>
          <th style="text-align: left">核心任务</th>
          <th style="text-align: left">关键细节</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: left"><strong>加载</strong></td>
          <td style="text-align: left">读取字节码，生成 Class 对象</td>
          <td style="text-align: left">由类加载器完成，字节码来源多样</td>
      </tr>
      <tr>
          <td style="text-align: left"><strong>验证</strong></td>
          <td style="text-align: left">确保字节码的正确性和安全性</td>
          <td style="text-align: left">4 个验证步骤，JVM 的安全屏障</td>
      </tr>
      <tr>
          <td style="text-align: left"><strong>准备</strong></td>
          <td style="text-align: left">为静态变量分配内存，设置默认初始值</td>
          <td style="text-align: left">final 静态常量直接赋值，实例变量不处理</td>
      </tr>
      <tr>
          <td style="text-align: left"><strong>解析</strong></td>
          <td style="text-align: left">符号引用转化为直接引用</td>
          <td style="text-align: left">支持动态解析，是多态的基础</td>
      </tr>
      <tr>
          <td style="text-align: left"><strong>初始化</strong></td>
          <td style="text-align: left">执行静态变量赋值和静态代码块</td>
          <td style="text-align: left">执行<code>&lt;clinit&gt;()</code>方法，父类先初始化</td>
      </tr>
  </tbody>
</table>
<h2 id="常见问题与注意事项">
<a class="header-anchor" href="#%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98%e4%b8%8e%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9"></a>
常见问题与注意事项
</h2><ul>
<li><strong>类加载的顺序</strong>：静态代码块 → 构造代码块 → 构造方法</li>
<li><strong>静态变量的赋值</strong>：准备阶段赋默认值，初始化阶段赋代码中的值</li>
<li><strong>被动引用不会触发初始化</strong>：这是很多面试题的考点</li>
<li><strong><code>&lt;clinit&gt;()</code> vs <code>&lt;init&gt;()</code></strong>：
<ul>
<li><code>&lt;clinit&gt;()</code>：类构造器，初始化类的静态成员，只执行一次</li>
<li><code>&lt;init&gt;()</code>：对象构造器，初始化对象的实例成员，每次创建对象都会执行</li>
</ul>
</li>
<li><strong>类加载器的双亲委派模型</strong>：JVM 默认采用双亲委派模型加载类，确保核心类的安全性</li>
</ul>
<h1 id="通过反射获取类的结构信息">
<a class="header-anchor" href="#%e9%80%9a%e8%bf%87%e5%8f%8d%e5%b0%84%e8%8e%b7%e5%8f%96%e7%b1%bb%e7%9a%84%e7%bb%93%e6%9e%84%e4%bf%a1%e6%81%af"></a>
通过反射获取类的结构信息
</h1><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="c1">// 父类</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">class</span> <span class="nc">Base</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">basePublicField</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">private</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">basePrivateField</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">basePublicMethod</span><span class="p">()</span><span class="w"> </span><span class="p">{}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">private</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">basePrivateMethod</span><span class="p">()</span><span class="w"> </span><span class="p">{}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c1">// 子类（演示用）</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nd">@Deprecated</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">Student</span><span class="w"> </span><span class="kd">extends</span><span class="w"> </span><span class="n">Base</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// 不同修饰符的属性</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">name</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">protected</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">age</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">private</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">address</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">SCHOOL</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&#34;清华大学&#34;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// 不同修饰符的构造器</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="nf">Student</span><span class="p">()</span><span class="w"> </span><span class="p">{}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="nf">Student</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">name</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="na">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">name</span><span class="p">;</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">private</span><span class="w"> </span><span class="nf">Student</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">name</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">age</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="na">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">name</span><span class="p">;</span><span class="w"> </span><span class="k">this</span><span class="p">.</span><span class="na">age</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">age</span><span class="p">;</span><span class="w"> </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="c1">// 不同修饰符的方法</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">study</span><span class="p">()</span><span class="w"> </span><span class="p">{}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">protected</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">eat</span><span class="p">()</span><span class="w"> </span><span class="p">{}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">private</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">sleep</span><span class="p">()</span><span class="w"> </span><span class="p">{}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">run</span><span class="p">()</span><span class="w"> </span><span class="p">{}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h2 id="javalangclass-类">
<a class="header-anchor" href="#javalangclass-%e7%b1%bb"></a>
java.lang.Class 类
</h2><p>![[Pasted image 20260407211101.png]]
所有获取类结构信息的操作，都从 <code>Class</code> 对象开始。
<strong>代码示例</strong>：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">java.lang.annotation.Annotation</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kn">import</span><span class="w"> </span><span class="nn">java.lang.reflect.Constructor</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kn">import</span><span class="w"> </span><span class="nn">java.lang.reflect.Field</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kn">import</span><span class="w"> </span><span class="nn">java.lang.reflect.Method</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">ReflectionUtilsDemo</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="kd">throws</span><span class="w"> </span><span class="n">Exception</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Class</span><span class="o">&lt;</span><span class="n">Student</span><span class="o">&gt;</span><span class="w"> </span><span class="n">studentClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Student</span><span class="p">.</span><span class="na">class</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 1. getName: 获取全类名（包名+类名）</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;1. 全类名：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">studentClass</span><span class="p">.</span><span class="na">getName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 输出：com.hspedu.reflection.Student</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 2. getSimpleName: 获取简单类名</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;\n2. 简单类名：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">studentClass</span><span class="p">.</span><span class="na">getSimpleName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 输出：Student</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 3. getFields: 获取所有public修饰的属性，包含本类以及父类的</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 不能访问私有成员</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;\n3. 所有public属性（含父类）：&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Field</span><span class="o">[]</span><span class="w"> </span><span class="n">publicFields</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">studentClass</span><span class="p">.</span><span class="na">getFields</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Field</span><span class="w"> </span><span class="n">field</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">publicFields</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;- &#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">field</span><span class="p">.</span><span class="na">getName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 输出：name, SCHOOL, basePublicField</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 4. getDeclaredFields: 获取本类中所有属性（不包含父类）</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 配合 setAccessible(true)能访问私有成员</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;\n4. 本类所有属性（不含父类）：&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Field</span><span class="o">[]</span><span class="w"> </span><span class="n">allFields</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">studentClass</span><span class="p">.</span><span class="na">getDeclaredFields</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Field</span><span class="w"> </span><span class="n">field</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">allFields</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;- &#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">field</span><span class="p">.</span><span class="na">getName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 输出：name, age, address, SCHOOL</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 5. getMethods: 获取所有public修饰的方法，包含本类以及父类的</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;\n5. 所有public方法（含父类）：&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Method</span><span class="o">[]</span><span class="w"> </span><span class="n">publicMethods</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">studentClass</span><span class="p">.</span><span class="na">getMethods</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Method</span><span class="w"> </span><span class="n">method</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">publicMethods</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;- &#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">method</span><span class="p">.</span><span class="na">getName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 输出：study, run, basePublicMethod, wait, equals, toString, hashCode...（Object类的方法）</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 6. getDeclaredMethods: 获取本类中所有方法（不包含父类）</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;\n6. 本类所有方法（不含父类）：&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Method</span><span class="o">[]</span><span class="w"> </span><span class="n">allMethods</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">studentClass</span><span class="p">.</span><span class="na">getDeclaredMethods</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Method</span><span class="w"> </span><span class="n">method</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">allMethods</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;- &#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">method</span><span class="p">.</span><span class="na">getName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 输出：study, eat, sleep, run</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 7. getConstructors: 获取本类所有public修饰的构造器</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;\n7. 所有public构造器：&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Constructor</span><span class="o">&lt;?&gt;[]</span><span class="w"> </span><span class="n">publicConstructors</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">studentClass</span><span class="p">.</span><span class="na">getConstructors</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Constructor</span><span class="o">&lt;?&gt;</span><span class="w"> </span><span class="n">constructor</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">publicConstructors</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;- &#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">constructor</span><span class="p">.</span><span class="na">getName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 输出：com.hspedu.reflection.Student（无参）、com.hspedu.reflection.Student（一个参数）</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 8. getDeclaredConstructors: 获取本类中所有构造器</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;\n8. 本类所有构造器：&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Constructor</span><span class="o">&lt;?&gt;[]</span><span class="w"> </span><span class="n">allConstructors</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">studentClass</span><span class="p">.</span><span class="na">getDeclaredConstructors</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Constructor</span><span class="o">&lt;?&gt;</span><span class="w"> </span><span class="n">constructor</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">allConstructors</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;- &#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">constructor</span><span class="p">.</span><span class="na">getName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 输出：无参、一个参数、两个参数（私有）</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 9. getPackage: 以Package形式返回包信息</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;\n9. 包信息：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">studentClass</span><span class="p">.</span><span class="na">getPackage</span><span class="p">().</span><span class="na">getName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 输出：com.hspedu.reflection</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 10. getSuperClass: 以Class形式返回父类信息</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;\n10. 父类信息：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">studentClass</span><span class="p">.</span><span class="na">getSuperclass</span><span class="p">().</span><span class="na">getName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 输出：com.hspedu.reflection.Base</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 11. getInterfaces: 以Class[]形式返回接口信息</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;\n11. 实现的接口：&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Class</span><span class="o">&lt;?&gt;[]</span><span class="w"> </span><span class="n">interfaces</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">studentClass</span><span class="p">.</span><span class="na">getInterfaces</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Class</span><span class="o">&lt;?&gt;</span><span class="w"> </span><span class="n">anInterface</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">interfaces</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;- &#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">anInterface</span><span class="p">.</span><span class="na">getName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 输出：无（Student类没有实现接口）</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 12. getAnnotations: 以Annotation[]形式返回注解信息</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;\n12. 类上的注解：&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Annotation</span><span class="o">[]</span><span class="w"> </span><span class="n">annotations</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">studentClass</span><span class="p">.</span><span class="na">getAnnotations</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Annotation</span><span class="w"> </span><span class="n">annotation</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">annotations</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;- &#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">annotation</span><span class="p">.</span><span class="na">annotationType</span><span class="p">().</span><span class="na">getName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="c1">// 输出：java.lang.Deprecated</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h2 id="javalangreflectfield-类">
<a class="header-anchor" href="#javalangreflectfield-%e7%b1%bb"></a>
java.lang.reflect.Field 类
</h2><p>用于获取和操作类的属性信息。
![[Pasted image 20260407211739.png]]
<strong>代码示例</strong>：</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">java.lang.reflect.Field</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kn">import</span><span class="w"> </span><span class="nn">java.lang.reflect.Modifier</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">FieldDemo</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Class</span><span class="o">&lt;</span><span class="n">Student</span><span class="o">&gt;</span><span class="w"> </span><span class="n">studentClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Student</span><span class="p">.</span><span class="na">class</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Field</span><span class="o">[]</span><span class="w"> </span><span class="n">allFields</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">studentClass</span><span class="p">.</span><span class="na">getDeclaredFields</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Field</span><span class="w"> </span><span class="n">field</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">allFields</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;属性名：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">field</span><span class="p">.</span><span class="na">getName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="c1">// 1. getModifiers: 以int形式返回修饰符</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="kt">int</span><span class="w"> </span><span class="n">modifiers</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">field</span><span class="p">.</span><span class="na">getModifiers</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="c1">// 将int值转换为对应的修饰符字符串</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">String</span><span class="w"> </span><span class="n">modifierStr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Modifier</span><span class="p">.</span><span class="na">toString</span><span class="p">(</span><span class="n">modifiers</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;修饰符：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">modifierStr</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">&#34;（int值：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">modifiers</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">&#34;）&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="c1">// 2. getType: 以Class形式返回属性类型</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">Class</span><span class="o">&lt;?&gt;</span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">field</span><span class="p">.</span><span class="na">getType</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;属性类型：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">type</span><span class="p">.</span><span class="na">getName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;------------------------&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><blockquote>
<p>多个修饰符是<strong>相加</strong>的关系：<code>public(1) + static(8) + final(16) = 25</code></p>
</blockquote>
<table>
  <thead>
      <tr>
          <th style="text-align: left">修饰符</th>
          <th style="text-align: left">int 值</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: left">默认（包访问权限）</td>
          <td style="text-align: left">0</td>
      </tr>
      <tr>
          <td style="text-align: left">public</td>
          <td style="text-align: left">1</td>
      </tr>
      <tr>
          <td style="text-align: left">private</td>
          <td style="text-align: left">2</td>
      </tr>
      <tr>
          <td style="text-align: left">protected</td>
          <td style="text-align: left">4</td>
      </tr>
      <tr>
          <td style="text-align: left">static</td>
          <td style="text-align: left">8</td>
      </tr>
      <tr>
          <td style="text-align: left">final</td>
          <td style="text-align: left">16</td>
      </tr>
  </tbody>
</table>
<h2 id="javalangreflectmethod-类">
<a class="header-anchor" href="#javalangreflectmethod-%e7%b1%bb"></a>
java.lang.reflect.Method 类
</h2><p>用于获取和调用类的方法信息。
![[Pasted image 20260407211751.png]]
<strong>代码示例：</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">java.lang.reflect.Method</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kn">import</span><span class="w"> </span><span class="nn">java.lang.reflect.Modifier</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">MethodDemo</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Class</span><span class="o">&lt;</span><span class="n">Student</span><span class="o">&gt;</span><span class="w"> </span><span class="n">studentClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Student</span><span class="p">.</span><span class="na">class</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Method</span><span class="o">[]</span><span class="w"> </span><span class="n">allMethods</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">studentClass</span><span class="p">.</span><span class="na">getDeclaredMethods</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Method</span><span class="w"> </span><span class="n">method</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">allMethods</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;方法名：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">method</span><span class="p">.</span><span class="na">getName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="c1">// 1. getModifiers: 以int形式返回修饰符</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="kt">int</span><span class="w"> </span><span class="n">modifiers</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">method</span><span class="p">.</span><span class="na">getModifiers</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">String</span><span class="w"> </span><span class="n">modifierStr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Modifier</span><span class="p">.</span><span class="na">toString</span><span class="p">(</span><span class="n">modifiers</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;修饰符：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">modifierStr</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="c1">// 2. getReturnType: 以Class形式获取返回类型</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">Class</span><span class="o">&lt;?&gt;</span><span class="w"> </span><span class="n">returnType</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">method</span><span class="p">.</span><span class="na">getReturnType</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;返回类型：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">returnType</span><span class="p">.</span><span class="na">getName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="c1">// 3. getParameterTypes: 以Class[]返回参数类型数组</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">Class</span><span class="o">&lt;?&gt;[]</span><span class="w"> </span><span class="n">parameterTypes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">method</span><span class="p">.</span><span class="na">getParameterTypes</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">print</span><span class="p">(</span><span class="s">&#34;参数类型：&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Class</span><span class="o">&lt;?&gt;</span><span class="w"> </span><span class="n">parameterType</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">parameterTypes</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">print</span><span class="p">(</span><span class="n">parameterType</span><span class="p">.</span><span class="na">getName</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">&#34; &#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;\n------------------------&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h2 id="javalangreflectconstructor-类">
<a class="header-anchor" href="#javalangreflectconstructor-%e7%b1%bb"></a>
java.lang.reflect.Constructor 类
</h2><p>用于获取和调用类的构造器信息。
![[Pasted image 20260407211802.png]]
<strong>代码示例：</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">java.lang.reflect.Constructor</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kn">import</span><span class="w"> </span><span class="nn">java.lang.reflect.Modifier</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">ConstructorDemo</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Class</span><span class="o">&lt;</span><span class="n">Student</span><span class="o">&gt;</span><span class="w"> </span><span class="n">studentClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Student</span><span class="p">.</span><span class="na">class</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="n">Constructor</span><span class="o">&lt;?&gt;[]</span><span class="w"> </span><span class="n">allConstructors</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">studentClass</span><span class="p">.</span><span class="na">getDeclaredConstructors</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Constructor</span><span class="o">&lt;?&gt;</span><span class="w"> </span><span class="n">constructor</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">allConstructors</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;构造器名：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">constructor</span><span class="p">.</span><span class="na">getName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="c1">// 1. getModifiers: 以int形式返回修饰符</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="kt">int</span><span class="w"> </span><span class="n">modifiers</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">constructor</span><span class="p">.</span><span class="na">getModifiers</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">String</span><span class="w"> </span><span class="n">modifierStr</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Modifier</span><span class="p">.</span><span class="na">toString</span><span class="p">(</span><span class="n">modifiers</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;修饰符：&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">modifierStr</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="c1">// 2. getParameterTypes: 以Class[]返回参数类型数组</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">Class</span><span class="o">&lt;?&gt;[]</span><span class="w"> </span><span class="n">parameterTypes</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">constructor</span><span class="p">.</span><span class="na">getParameterTypes</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">print</span><span class="p">(</span><span class="s">&#34;参数类型：&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Class</span><span class="o">&lt;?&gt;</span><span class="w"> </span><span class="n">parameterType</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">parameterTypes</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">                </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">print</span><span class="p">(</span><span class="n">parameterType</span><span class="p">.</span><span class="na">getName</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">&#34; &#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;\n------------------------&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div>
        
        <hr><p>本文2026-04-11首发于<a href='https://blog.arcanelune.top/'>TrueSolのblog</a>，最后修改于2026-04-12</p><p>本博客所有文章除特别声明外，均采用 BY-NC-SA 许可协议。转载请注明出处！</p>]]></description><category>Java</category></item><item><title>我的第一篇文章</title><link>https://blog.arcanelune.top/post/my-first-post/</link><pubDate>Fri, 10 Apr 2026 12:52:04 +0800</pubDate><author>3359429309@qq.com (TrueSol)</author><guid>https://blog.arcanelune.top/post/my-first-post/</guid><description>
<![CDATA[<h1>我的第一篇文章</h1><p>作者：TrueSol（3359429309@qq.com）</p>
        
          <h1 id="这里开始写文章正文支持-markdown-格式">
<a class="header-anchor" href="#%e8%bf%99%e9%87%8c%e5%bc%80%e5%a7%8b%e5%86%99%e6%96%87%e7%ab%a0%e6%ad%a3%e6%96%87%e6%94%af%e6%8c%81-markdown-%e6%a0%bc%e5%bc%8f"></a>
这里开始写文章正文（支持 Markdown 格式）
</h1><p>这是文章的正文内容&hellip;</p>
<h1 id="记录一下所有的front-matter-字段">
<a class="header-anchor" href="#%e8%ae%b0%e5%bd%95%e4%b8%80%e4%b8%8b%e6%89%80%e6%9c%89%e7%9a%84front-matter-%e5%ad%97%e6%ae%b5"></a>
记录一下所有的Front-matter 字段
</h1><h1 id="hugo内置基础字段">
<a class="header-anchor" href="#hugo%e5%86%85%e7%bd%ae%e5%9f%ba%e7%a1%80%e5%ad%97%e6%ae%b5"></a>
Hugo内置基础字段
</h1><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yml" data-lang="yml"><span class="line"><span class="cl"><span class="nt">title</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;Reimu主题Front-matter全字段详解与实战&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">date</span><span class="p">:</span><span class="w"> </span><span class="ld">2026-04-28T18:00:00</span><span class="m">+08</span><span class="p">:</span><span class="m">00</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">lastmod</span><span class="p">:</span><span class="w"> </span><span class="ld">2026-04-28T20:30:00</span><span class="m">+08</span><span class="p">:</span><span class="m">00</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">summary</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;本文完整拆解Reimu主题支持的所有Front-matter字段，从基础配置到扩展功能，每个字段都附带可直接复制的实战案例，帮你精细化控制单篇文章的展示与功能。&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">weight</span><span class="p">:</span><span class="w"> </span><span class="m">2</span><span class="w">
</span></span></span></code></pre></div><h1 id="封面与视觉">
<a class="header-anchor" href="#%e5%b0%81%e9%9d%a2%e4%b8%8e%e8%a7%86%e8%a7%89"></a>
封面与视觉
</h1><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yml" data-lang="yml"><span class="line"><span class="cl"><span class="nt">cover</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;https://example.com/cover/reimu-frontmatter.jpg&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">banner</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;https://example.com/banner/reimu-frontmatter-banner.jpg&#34;</span><span class="w">
</span></span></span></code></pre></div><h1 id="分类与seo">
<a class="header-anchor" href="#%e5%88%86%e7%b1%bb%e4%b8%8eseo"></a>
分类与SEO
</h1><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yml" data-lang="yml"><span class="line"><span class="cl"><span class="nt">categories</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;博客搭建&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;Hugo&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">tags</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;Hugo&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;Reimu主题&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;Front-matter&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;博客教程&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">description</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;本文包含Reimu主题所有Front-matter字段&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">keywords</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;Hugo&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;Reimu主题&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;Front-matter&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;博客搭建&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">author</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;ArcaneLune&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># 功能开关</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">mermaid</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">math</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">copyright</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">sponsor</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">comments</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">outdated</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="c"># 布局控制</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">sidebar</span><span class="p">:</span><span class="w"> </span><span class="l">right</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">toc</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span></code></pre></div>
        
        <hr><p>本文2026-04-10首发于<a href='https://blog.arcanelune.top/'>TrueSolのblog</a>，最后修改于2026-04-10</p><p>本博客所有文章除特别声明外，均采用 BY-NC-SA 许可协议。转载请注明出处！</p>]]></description></item></channel></rss>