news 2026/7/6 8:07:44

455. Java 反射 - 核心 Class 类

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
455. Java 反射 - 核心 Class 类

文章目录

  • 455. Java 反射 - 核心 Class 类
    • 1. 什么是 Class 类?
    • 2. 获取 Class 对象的三种标准方式
      • 代码示例:
    • 3. 不同类型的 Class 表现
    • 4. ClassLoader:类的加载器
      • 加载器层级:
      • 示例代码:
    • 5. 总结

455. Java 反射 - 核心 Class 类

1. 什么是 Class 类?

在 Java 中,java.lang.Class是反射机制的入口

  • 类型的镜子:每个类加载到 JVM 后,都会产生一个唯一的Class对象。它描述了该类的结构(成员变量、方法、构造器、父类等)。
  • 万物皆有 Class:不仅是普通的类,接口、枚举、数组、基本类型(如int.class)、甚至 Lambda 表达式和匿名类,在 JVM 中都有对应的Class实例。
  • 单例性:对于同一个类,JVM 只会创建一个Class实例。

2. 获取 Class 对象的三种标准方式

方式语法适用场景
通过对象实例obj.getClass()已有对象实例,想知道它的运行时实际类型。
通过类字面量ClassName.class编译期已知类名,最安全、性能最高的方式。
通过类名字符串Class.forName("全类名")编译期不知道类名,运行时动态加载(如从配置文件读取)。

代码示例:

// 1. getClass():总是返回实际运行时的类型List<String>list=newArrayList<>();System.out.println(list.getClass());// class java.util.ArrayList// 2. 类字面量Class<?>c1=String.class;Class<?>c2=int.class;// 基本类型也可以// 3. 动态加载 (需要处理异常)Class<?>c3=Class.forName("java.util.Scanner");

3. 不同类型的 Class 表现

反射不仅限于普通类,看看其他特殊类型在“镜子”里的样子:

  • 数组 (Arrays):内部名由[和类型缩写组成。

    byte[]bytes=newbyte[10];System.out.println(bytes.getClass());// class [B (B代表byte)
  • 枚举 (Enums):返回的是整个枚举类型的定义。

    enumColor{RED,BLUE}System.out.println(Color.RED.getClass());// class Color
  • 匿名内部类:由编译器自动生成,命名格式通常为外部类$数字

    Runnabler=newRunnable(){@Overridepublicvoidrun(){}};System.out.println(r.getClass());// class Main$1
  • Lambda 表达式:由 JVM 在运行时动态生成的匿名类,通常不建议依赖其类名。


4. ClassLoader:类的加载器

每一个Class对象内部都持有一个对ClassLoader的引用,负责将字节码文件加载到内存中。

加载器层级:

  1. Bootstrap ClassLoader (启动类加载器):加载 JDK 核心库(如java.lang.*)。在代码中通常返回null
  2. Platform/Extension ClassLoader (扩展类加载器):加载标准扩展库。
  3. App/System ClassLoader (应用类加载器):加载我们自己编写的类和第三方 Jar 包。

示例代码:

// JDK 核心类由 Bootstrap 加载,返回 nullSystem.out.println(String.class.getClassLoader());// 自定义类由 AppClassLoader 加载System.out.println(MyClass.class.getClassLoader());

5. 总结

  • 入口点:所有反射操作(获取字段、调用方法)都必须先拿到Class对象。
  • 动态性Class.forName()是实现插件化和框架解耦的关键。
  • 唯一性:无论你用哪种方式获取,同一个类的Class对象在内存中只有一个。
  • 泛型擦除:注意,List<String>.class是不存在的,反射只能拿到原始类型List.class
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/6 8:07:08

GPT-5.6三大模型全曝,定档7月7日?

突发偷跑&#xff01;GPT-5.6三大神秘模型底层代码曝光&#xff0c;下周二重磅降临。这一波&#xff0c;OpenAI是卡点截杀Claude&#xff0c;用超高额度「趁火打劫」。7月7日&#xff0c;有大事要发生。 GPT-5.6&#xff0c;将于下周发布&#xff1f; 就在昨天&#xff0c;网友…

作者头像 李华
网站建设 2026/7/6 8:05:27

高效C++线程池设计与实现

在高性能服务器和实时系统中&#xff0c;线程的创建与销毁开销往往成为瓶颈。线程池&#xff08;Thread Pool&#xff09;预先创建并维护一组工作线程&#xff0c;通过任务队列复用线程执行计算任务&#xff0c;能够显著降低上下文切换和资源分配延迟。然而&#xff0c;一个“能…

作者头像 李华
网站建设 2026/7/6 8:05:05

基于GPT-5.5的开源RAG框架性能对比与选型建议:企业级知识库怎么选?

大模型落地进入下半场&#xff0c;企业级RAG&#xff08;检索增强生成&#xff09;已成为标配。最近&#xff0c;很多开发者都在探索如何利用GPT-5.5的超长上下文和强推理能力升级现有的知识库方案。为了验证不同框架在最新大模型下的适配度&#xff0c;我通过AI模型聚合平台 y…

作者头像 李华
网站建设 2026/7/6 8:04:56

让AI Agent拥有本地永久记忆:零费用且中文友好的解决方案

让你的 AI Agent 拥有永不遗忘的长期记忆。一行命令接入&#xff0c;零 API 费用&#xff0c;数据 100% 本地存储。 前言&#xff1a;AI Agent 的"金鱼记忆"之痛 用过 Claude Code、Cursor、Cline、Hermes 等 AI 编程助手的同学一定有过这种体验&#xff1a; 上次告…

作者头像 李华
网站建设 2026/7/6 8:02:49

iOS应用SSL Pinning绕过实战:以Instagram V405.1为例

1. 项目概述与背景 最近在移动安全研究圈里&#xff0c;一个老生常谈但又历久弥新的技术话题又被推到了台前&#xff1a;如何绕过 Instagram 这类头部社交应用的 SSL Pinning&#xff08;证书绑定&#xff09;机制&#xff0c;特别是在其 iOS 版本 V405.1 上。这可不是为了搞破…

作者头像 李华
网站建设 2026/7/6 8:01:35

+86 手机号登录 TG提示 smsfee 的排查与解决

问题描述近期尝试使用 86 手机号注册登录 Telegram&#xff0c;遇到以下情况&#xff1a;官方客户端输入手机号后&#xff0c;提示 smsfee&#xff0c;无法发送验证码部分教程建议支付 smsfee 费用&#xff0c;但支付后仍未收到验证码更换网络环境&#xff08;Wi-Fi / 4G / 5G&…

作者头像 李华