@[TOC](Java 中 Class.forName() 用法详解)

在这里插入图片描述

博主 默语带您 Go to New World.
个人主页—— 默语 的博客👦🏻 优秀内容
《java 面试题大全》
《java 专栏》
《idea技术专区》
《spring boot 技术专区》
《MyBatis从入门到精通》
《23种设计模式》
《经典算法学习》
《spring 学习》
《MYSQL从入门到精通》数据库是开发者必会基础之一~
🍩惟余辈才疏学浅,临摹之作或有不妥之处,还请读者海涵指正。☕🍭
🪁 吾期望此文有资助于尔,即使粗浅难及深广,亦备添少许微薄之助。苟未尽善尽美,敬请批评指正,以资改进。!💻⌨


默语是谁?

大家好,我是 默语,别名默语博主,擅长的技术领域包括Java、运维和人工智能。我的技术背景扎实,涵盖了从后端开发到前端框架的各个方面,特别是在Java 性能优化、多线程编程、算法优化等领域有深厚造诣。

目前,我活跃在CSDN、掘金、阿里云和 51CTO等平台,全网拥有超过10万的粉丝,总阅读量超过1400 万。统一 IP 名称为 默语 或者 默语博主。我是 CSDN 博客专家、阿里云专家博主和掘金博客专家,曾获博客专家、优秀社区主理人等多项荣誉,并在 2023 年度博客之星评选中名列前 50。我还是 Java 高级工程师、自媒体博主,北京城市开发者社区的主理人,拥有丰富的项目开发经验和产品设计能力。希望通过我的分享,帮助大家更好地了解和使用各类技术产品,在不断的学习过程中,可以帮助到更多的人,结交更多的朋友.


我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。


Java 中 Class.forName() 用法详解

摘要

Class.forName() 是 Java 反射机制中的重要方法,用于动态加载类并初始化类的字节码。在框架开发和底层实现中经常见到其身影,例如 JDBC 驱动加载和动态代理。
本文将带你深入理解 Class.forName() 的核心功能、用法及注意事项,并通过代码示例逐步讲解。无论你是 Java 小白还是正在学习反射的开发者,希望本篇教程对你有所帮助!


引言

什么是 Class.forName()

Class.forName()java.lang.Class 类的一个静态方法,用于通过类的全限定名(fully qualified name)加载类。它是 Java 反射的基础之一,允许程序在运行时获取类的元信息。

常见场景:

  1. 动态加载类:如 JDBC 驱动程序。
  2. 框架开发:如 Spring 的 Bean 定义。
  3. 插件机制:动态加载插件类。

正文

一、方法定义与核心功能

方法签名
Class.forName(String className)
public static Class<?> forName(String className) throws ClassNotFoundException
参数说明
  • className:类的全限定名(包含包路径的类名,例如 java.util.ArrayList)。
返回值
  • 返回加载的类对应的 Class 对象。
抛出异常
  • ClassNotFoundException:如果类名错误或类不存在,会抛出此异常。

二、基础用法:加载一个类

1. 加载类并返回 Class 对象
public class Main {
    public static void main(String[] args) {
        try {
            // 动态加载 java.util.ArrayList 类
            Class<?> clazz = Class.forName("java.util.ArrayList");
            System.out.println("类名:" + clazz.getName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

输出:

类名:java.util.ArrayList
2. 加载用户自定义类
class Person {
    private String name;
    private int age;

    // 构造器
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public class Main {
    public static void main(String[] args) {
        try {
            // 动态加载自定义类
            Class<?> clazz = Class.forName("Person");
            System.out.println("类名:" + clazz.getName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

注意:如果 Person 类未在正确的包中或包路径未包含在项目中,会抛出 ClassNotFoundException


三、Class.forName() 与 JDBC 驱动加载

在 JDBC 中,Class.forName() 用于加载数据库驱动程序。

示例:加载 MySQL 驱动程序
import java.sql.Connection;
import java.sql.DriverManager;

public class Main {
    public static void main(String[] args) {
        try {
            // 动态加载 MySQL 驱动程序
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("MySQL 驱动加载成功!");

            // 建立数据库连接
            String url = "jdbc:mysql://localhost:3306/test";
            String user = "root";
            String password = "password";
            Connection conn = DriverManager.getConnection(url, user, password);
            System.out.println("数据库连接成功!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

输出:

MySQL 驱动加载成功!
数据库连接成功!

四、加载类并初始化静态代码块

Class.forName() 不仅加载类,还会执行类的静态代码块。

示例:验证静态代码块执行
class Example {
    static {
        System.out.println("静态代码块已执行!");
    }
}

public class Main {
    public static void main(String[] args) {
        try {
            // 加载类
            Class.forName("Example");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

输出:

静态代码块已执行!

五、懒加载与 ClassLoader 对比

ClassLoader 示例

ClassLoader 仅加载类,不会执行静态代码块。

class Example {
    static {
        System.out.println("静态代码块已执行!");
    }
}

public class Main {
    public static void main(String[] args) {
        try {
            // 使用 ClassLoader 加载类
            ClassLoader classLoader = Main.class.getClassLoader();
            classLoader.loadClass("Example");
            System.out.println("ClassLoader 加载完成!");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

输出:

ClassLoader 加载完成!

总结:

  • Class.forName():加载类并初始化静态代码块。
  • ClassLoader:仅加载类,不会触发初始化。

六、Class.forName() 的常见异常与解决方案

1. ClassNotFoundException
  • 原因:类名错误或类未在正确的包路径下。
  • 解决:确保类名的拼写正确,且包路径包含类文件。
2. NoClassDefFoundError
  • 原因:编译期存在的类在运行期找不到。
  • 解决:检查依赖库是否完整,确保运行时环境一致。

总结

通过本文,你应该掌握了 Class.forName() 的核心用法:从基本的类加载,到 JDBC 驱动的应用,再到静态代码块的执行原理。这一方法在 Java 的反射与动态加载中占据重要地位,为框架设计和模块化开发提供了强大的支持。

如果你对 Java 中的反射机制或 Class.forName() 的其他应用还有疑问,欢迎添加我的微信 (微信号:xxxxxx),一起交流讨论吧!


参考资料

在这里插入图片描述


🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

如对本文内容有任何疑问、建议或意见,请联系作者,作者将尽力回复并改进📓;(联系微信:Solitudemind )

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

在这里插入图片描述

更多推荐