Class.forName和classloader的区别?

Class.forName

Class.forName 是 Java 反射机制中的关键方法,用于在运行时加载和初始化类。

Class.forName通常用于需要立即使用类的场景,例如:加载JDBC驱动。

Class.forName("com.mysql.cj.jdbc.Driver");
  • 用途:用于动态加载类并初始化该类。
  • 行为:不仅加载类,还会执行类的静态初始化块、和静态变量的初始化。
  • 返回值:返回一个Class对象,该对象表示加载的类。
  • 异常处理:可能抛出ClassNotFoundException,需要进行异常处理。
  • 使用场景:通常用于在运行时根据类名字符串动态加载类,例如在JDBC中加载数据库驱动程序。

 

ClassLoader

ClassLoader 相对于 Class.forNameClassLoader 允许更细粒度的控制。

例如:自定义类加载器、和延迟初始化。

try {
    ClassLoader classLoader = MyClass.class.getClassLoader();
    Class<?> clazz = classLoader.loadClass("com.example.MyClass");
    // 进行进一步操作,如实例化该类
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}
  • 用途:用于加载类,提供更为细粒度的控制,可以加载类而不执行类的静态初始化块。
  • 默认行为:只加载类,不执行类的静态初始化块,除非显式地调用Class.forName或者Class.newInstance
  • 返回值:返回一个Class对象,该对象表示加载的类。
  • 异常处理:可能抛出ClassNotFoundException,需要进行异常处理。
  • 使用场景:常用于定制类加载行为,比如从不同的源(如文件、网络)加载类,或者在插件系统中动态加载和管理类。

 

主要区别

1.初始化行为区别

Class.forName:默认会初始化类,即执行静态初始化块和静态变量初始化。

ClassLoader.loadClass:仅加载类而不初始化,除非显式调用初始化方法。

2.灵活性区别

Class.forName:主要用于简单的类加载和初始化。

ClassLoader:提供更大的灵活性,允许自定义类加载策略。

3.控制加载源区别

Class.forName:使用默认的系统类加载器。

ClassLoader:可以使用自定义类加载器,从不同的源加载类。

4.用法场景区别

Class.forName:多用于简单的反射操作和需要立即初始化的场景。

ClassLoader:多用于复杂的类加载场景,如插件框架、模块化系统等。

 

mikechen

mikechen睿哥,10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复架构即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法