@[TOC](Java 中 Class.forName() 用法详解)
Class.forName() 用法详解Class.forName() 是 Java 反射机制中的重要方法,用于动态加载类并初始化类的字节码。在框架开发和底层实现中经常见到其身影,例如 JDBC 驱动加载和动态代理。
本文将带你深入理解 Class.forName() 的核心功能、用法及注意事项,并通过代码示例逐步讲解。无论你是 Java 小白还是正在学习反射的开发者,希望本篇教程对你有所帮助!
Class.forName()?Class.forName() 是 java.lang.Class 类的一个静态方法,用于通过类的全限定名(fully qualified name)加载类。它是 Java 反射的基础之一,允许程序在运行时获取类的元信息。
常见场景:
Class.forName(String className)
public static Class<?> forName(String className) throws ClassNotFoundExceptionclassName:类的全限定名(包含包路径的类名,例如 java.util.ArrayList)。Class 对象。ClassNotFoundException:如果类名错误或类不存在,会抛出此异常。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.ArrayListclass 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() 用于加载数据库驱动程序。
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 仅加载类,不会执行静态代码块。
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() 的常见异常与解决方案ClassNotFoundExceptionNoClassDefFoundError通过本文,你应该掌握了 Class.forName() 的核心用法:从基本的类加载,到 JDBC 驱动的应用,再到静态代码块的执行原理。这一方法在 Java 的反射与动态加载中占据重要地位,为框架设计和模块化开发提供了强大的支持。