news 2026/6/9 16:06:14

反射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/6/8 19:23:24

计算机Java毕设实战-基于springboot+vue技术的二手车交易管理系统的设计与实现基于SpringBoot+Vue的二手车交易平台设计【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/8 20:08:26

数据库介绍

数据库 1、什么是数据库 数据库&#xff08;Database&#xff09;是按照数据结构来组织、存储和管理数据的仓库。 每个数据库都有一个或多个不同的 API 用于创建&#xff0c;访问&#xff0c;管理&#xff0c;搜索和复制所保存的数据。 我们也可以将数据存储在文件中&#xf…

作者头像 李华
网站建设 2026/6/8 19:44:28

Python+uniapp微信小程序智慧党建活动中心系统设计与开发 三端_4xxx1rk3

目录已开发项目效果实现截图开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;已开发项目效果实现截图 同行可拿货,招校园代理 Pythonuniapp微信小程序智慧党建活动中心系统设计与开发 三端…

作者头像 李华
网站建设 2026/6/8 19:57:54

springboot-vue购物商城系统 论文vue_o9m4k

目录已开发项目效果实现截图开发技术介绍核心代码参考示例1.建立用户稀疏矩阵&#xff0c;用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;已开发项目效果…

作者头像 李华
网站建设 2026/6/8 19:47:18

读人机沟通法则:理解数字世界的设计与形成05机器可以被测量

1. 遥测1.1. 小铃铛尖锐的叮当声让我们拥有某种低科技水平的感知能力&#xff0c;让我们知道有人在前台1.2. “遥测”(telemetry)这个词诞生于19世纪的法国&#xff0c;当时电信技术才刚出现1.2.1. 使用一种电子仪器将阿尔卑斯山最高峰勃朗峰的积雪深度传输到巴黎的过程1.2.2. …

作者头像 李华
网站建设 2026/6/9 13:47:27

Java计算机毕设之基于springBool+Vue美食分享平台的设计与实现基于SpringBoot + Vue的美食网站系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华