news 2026/5/1 5:12:03

反射2-获取class对象的三种方式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
反射2-获取class对象的三种方式

一、反射

在Java中,Class对象是反射机制的起点,它代表了JVM中加载的类的元数据。获取Class对象就像拿到了"类的身份证",有了它才能进行反射操作(如动态创建对象、调用方法、修改字段等)。

通俗比喻:Class对象就像是每个Java类的"身份证",有了它,我们就能在运行时"认识"这个类,了解它的结构,甚至"操作"它的内部。

1. 反射的核心:Class对象

反射的起点是Class对象。每个类被JVM加载后,都会生成一个唯一的Class对象,该对象存储了类的完整结构信息,包括:

  • 类的名称、包名
  • 父类、实现的接口
  • 字段(Field)
  • 方法(Method)
  • 构造器(Constructor)

获取Class对象的三种方式

Class是一个Java中已经定义好的类,类名是Class,其中有一个静态方法forName(),参数是类名,就可以获得到相应类的字节码文件。

方式1:类名.class(类字面常量)

Class<?> classObject = ClassName.class;
原理解析
  • 编译时确定,JVM会加载该类并生成Class对象
  • 编译器会进行类型检查,确保类存在
  • 不会触发类的初始化(如果类有静态代码块,不会执行)

优点
  • ✅ 编译时检查,类型安全
  • ✅ 性能最好(不需要运行时解析)
  • ✅ 代码简洁
缺点
  • ❌ 无法动态获取类名(需要硬编码类名)
通俗理解

就像你直接在书架上找到某本书的书名,书名已经写在书架上,你不需要问别人,直接就能拿到。

方式2:对象.getClass()

Class<?> classObject = object.getClass();
原理解析
  • 通过已有的对象实例获取其Class对象
  • 该方法是Object类的final方法,所有对象都有
  • 会触发类的初始化(如果类有静态代码块,会执行)

优点
  • ✅ 简单直接,不需要知道类名
  • ✅ 适用于多态场景(获取运行时实际类型)
缺点
  • ❌ 必须先有对象实例,否则会抛出NullPointerException
  • ❌ 无法在没有对象的情况下获取Class对象
通俗理解

就像你手里已经有一本书,直接翻到书的版权页,就能看到这本书的"身份证"。

方式3:Class.forName()

Class<?> classObject = Class.forName("全限定类名");
原理解析
  • 通过类的全限定名(包名+类名)动态加载类
  • 会触发JVM的类加载机制
  • 会执行类的静态代码块(初始化类)

优点
  • ✅ 高度灵活,可以处理字符串形式的类名
  • ✅ 适合配置化、动态加载的场景
缺点
  • ❌ 需要处理ClassNotFoundException异常
  • ❌ 性能稍低(需要运行时解析类名)
  • ❌ 会触发类的初始化
通俗理解

就像你从图书馆的目录表上找到一本书的名称,然后去书架上找这本书,可能需要等待工作人员帮你找。

package com.lkbhua.MyreflectDemo1; public class demo1 { public static void main(String[] args) throws Exception { /* 获取class对象的三种方式: 1. Class.forName("全类名") 2. 对象.getClass() 3. 类名.class */ // 1、Class.forName("全类名") // 全类名: 包名 + 类名 // 第一种最为常用 Class clazz = Class.forName("com.lkbhua.MyreflectDemo1.Student"); // 2、打印 System.out.println(clazz); // 2、类名.class // 一般更多的是当作参数进行传递 多线程synchronized(clazz)中 Class clazz2 = Student.class; System.out.println(clazz2 == clazz); // 3、对象.getClass() // 局限性: 当我们已经有了这个类的对象时,才可以使用 Student s = new Student(); Class clazz3 = s.getClass(); System.out.println(clazz3 == clazz); } }

三种方式对比总结

方式语法是否需要实例是否触发类加载是否触发初始化灵活性性能安全性
类名.classClassName.class低(需硬编码)⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
对象.getClass()object.getClass()✔️✔️⭐⭐⭐⭐⭐⭐⭐⭐
Class.forName()Class.forName("全限定类名")✔️✔️高(可动态)⭐⭐⭐⭐

:⭐越多表示越好

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 5:10:50

新品限免|国产大模型工程化实战:GLM-4.7与MiniMax M2.1 免费选型对比

一、技术定位与核心差异解析 在参与多个企业级项目开发后&#xff0c;我深刻体会到GLM-4.7与MiniMax M2.1在工程化落地中的差异化表现。这两款国产大模型已形成互补的技术生态&#xff0c;分别针对不同开发场景进行了深度优化。 GLM-4.7&#xff1a;复杂工程任务的一次性交付引…

作者头像 李华
网站建设 2026/5/1 5:11:26

vue基于python的民宿房间预订推荐系统的设计与实现_7r8s9b63(pycharm django flask)

目录已开发项目效果实现截图开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;已开发项目效果实现截图 同行可拿货,招校园代理 vue基于python的民宿房间预订推荐系统的设计与实现_7r8s9b63(…

作者头像 李华
网站建设 2026/5/1 5:11:36

Python+uniapp微信小程序智慧木材加工厂企业员工管理系统_o9dzif83

目录已开发项目效果实现截图开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;已开发项目效果实现截图 同行可拿货,招校园代理 Pythonuniapp微信小程序智慧木材加工厂企业员工管理系统_o9dz…

作者头像 李华
网站建设 2026/4/23 19:59:15

python基于web教师科研成果管理系统_747i23s5

目录已开发项目效果实现截图开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;已开发项目效果实现截图 同行可拿货,招校园代理 python基于web教师科研成果管理系统_747i23s5 开发技术路…

作者头像 李华
网站建设 2026/5/1 5:09:46

博睿数据「2025年度可观测性实践精选案例集」重磅发布 !

2025年&#xff0c;数字经济高质量发展加速推进&#xff0c;数字技术与实体经济的深度融合&#xff0c;正驱动企业广泛采用多云架构以加速创新&#xff0c;随着系统规模的激增与交互的复杂化&#xff0c;如何驾驭数字系统成为关键挑战。与此同时&#xff0c;GenAI、LLM、AIGC及…

作者头像 李华
网站建设 2026/4/18 15:15:56

超越RLVR陷阱:从设计“奖励契约”到构建“AI宪法”的架构思想

最近半年&#xff0c;和几个在不同公司做AI落地的老朋友聊天&#xff0c;发现一个微妙的变化。大家不再热烈讨论谁的模型参数大&#xff0c;谁的上下文更长。取而代之的是一种带着疲惫的共识&#xff1a;“我们的AI&#xff0c;越来越像个精通绩效考评的老油条了。”这不是某个…

作者头像 李华