Class.forName()主要功能:Class.forName(xxx.xx.xx)返回的是一个类,Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段。

对于大部分人来说,第一次见到 class.forName(String className) 这句代码应该是在使用 JDBC 方式连接数据库的时候。

实例

import com.mysql.jdbc.Driver;
import java.sql.*;public class JdbcDemo {public static void main(String[] args) throws SQLException, ClassNotFoundException {String url = "jdbc:mysql://127.0.0.1:3306/mydb";String username = "root";String password = "redhat";Class.forName("com.mysql.jdbc.Driver");Connection connection = DriverManager.getConnection(url, username, password);String sql = "SELECT * FROM msg";PreparedStatement prepareStatement = connection.prepareStatement(sql);ResultSet resultSet = prepareStatement.executeQuery();resultSet.next();String address = resultSet.getString("address");System.out.println(address);}
}

Class.forName 传入 com.mysql.jdbc.Driver 之后,就知道我连接的数据库是 mysql,这是为什么呢,看看源代码:

@CallerSensitive
public static Class forName(String className) throws ClassNotFoundException {Class caller = Reflection.getCallerClass();return forName0(className, true, ClassLoader.getClassLoader(caller), caller);
}

发现它调用了 forName0 方法,继续跟踪再看看:

private static native Class forName0(String name, boolean initialize,ClassLoader loader,Class caller)throws ClassNotFoundException;

native 方法,源码也只能到此结束了。再看看看官方文档的描述:
https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#forName(java.lang.String)

Returns the Class object associated with the class or interface with the given string name, using the given class loader. Given the fully qualified name for a class or interface (in the same format returned by getName) this method attempts to locate, load, and link the class or interface. The specified class loader is used to load the class or interface. If the parameter loader is null, the class is loaded through the bootstrap class loader. The class is initialized only if the initialize parameter is true and if it has not been initialized earlier.

大概翻译一下就是:返回一个给定类或者接口的一个 Class 对象,如果没有给定 classloader, 那么会使用根类加载器。如果 initalize 这个参数传了 true,那么给定的类如果之前没有被初始化过,那么会被初始化。我们在 JDBC 第一步的时候,传入的参数是 com.mysql.jdbc.Driver。也就是说这个类会被初始化,我们看一下这个类里面的内容:

public class Driver extends NonRegisteringDriver implements java.sql.Driver {static {try {java.sql.DriverManager.registerDriver(new Driver());} catch (SQLException E) {throw new RuntimeException("Can't register driver!");}
}public Driver() throws SQLException {// Required for Class.forName().newInstance()}
}

我们发现这个类也是超级简单的。一个构造函数和一个静态代码块。我们知道,类在初始化的时候,静态代码块的内容会被执行的。也就是说我们 Class.forName 和直接写 DriverManager.registerDriver(new Driver) 两者功能是等同的。我们换成这种写法,再试试看:

public class JdbcDemo {public static void main(String[] args) throws SQLException, ClassNotFoundException {String url = "jdbc:mysql://127.0.0.1:3306/mydb";String username = "root";String password = "redhat";//Class.forName("com.mysql.jdbc.Driver");DriverManager.registerDriver(new Driver());Connection connection = DriverManager.getConnection(url, username, password);String sql = "SELECT * FROM msg";PreparedStatement prepareStatement = connection.prepareStatement(sql);ResultSet resultSet = prepareStatement.executeQuery();resultSet.next();String address = resultSet.getString("address");System.out.println(address);}
}

发现代码,还是正常的执行了。

总结一下: Class.forName 方法的作用,就是初始化给定的类。而我们给定的 MySQL 的 Driver 类中,它在静态代码块中通过 JDBC 的 DriverManager 注册了一下驱动。我们也可以直接使用 JDBC 的驱动管理器注册 mysql 驱动,从而代替使用 Class.forName。

Java class.forname 功能介绍相关推荐

  1. Java 14 新功能介绍!

    Java 14 新功能介绍! Java 14预定于3月17日发布.那么,14版究竟有什么新功能,对于整天写代码.维护代码的Java开发者来说,哪些功能最有用呢? 作者 | Raoul-Gabriel ...

  2. Java 17 新功能介绍(LTS)

    点赞再看,动力无限.Hello world : ) 微信搜「 程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. Ja ...

  3. Java 版本任你发,我用Java8.(Java 15 新功能介绍 )

    Java 15 在 2020 年 9 月发布,虽然不是长久支持版本,但是也带来了 14 个新功能,这些新功能中有不少是十分实用的. Java 15 官方下载:Archived OpenJDK GA R ...

  4. Annotation之一:Java Annotation基本功能介绍

    一.元数据的作用 如果要对于元数据的作用进行分类,目前还没有明确的定义,不过我们可以根据它所起的作用,大致可分为三类: 编写文档:通过代码里标识的元数据生成文档.这是最常见的,也是java 最早提供的 ...

  5. Java 18 新功能介绍

    Java 18 在2022 年 3 月 22 日正式发布,Java 18 不是一个长期支持版本,这次更新共带来 9 个新功能. OpenJDK Java 18 下载:https://jdk.java. ...

  6. java s3_Amazon S3 功能介绍

    一 .Amazon S3介绍 Amazon Simple Storage Service (Amazon S3) 是一种对象存储,它具有简单的 Web 服务接口,可用于在 Web 上的任何位置存储和检 ...

  7. java ee打印功能_Java EE:异步构造和功能

    java ee打印功能 介绍 Java EE具有许多API和构造以支持异步执行. 从可伸缩性和性能的角度来看,这是至关重要的. 让我们假设2个模块相互交互. 当模块A (发送方)以同步方式向模块B ( ...

  8. Java SE 8新功能介绍:使用Streams API处理集合

    使用Java SE 8 Streams的代码更干净,易读且功能强大..... 在" Java SE 8新功能介绍"系列的这篇文章中,我们将深入解释和探索代码,以了解如何使用流遍历集 ...

  9. 程序猿二三事之工具使用-Eclipse调试Java常用功能介绍

    [ TOC ] 调试常用功能介绍 日常java开发中实际写代码的时间并不会很多,花在整理思路,代码重构,调试bug会占用很大部分时间. 熟练掌握调试工具,了解调试相关技巧,是java开发中减少调试时间 ...

最新文章

  1. Invalid byte tag in constant pool: 19 与 javax/el/ELManager问题解决
  2. java 浮点数精度_Java中浮点数精度问题
  3. mac homebrew
  4. 201771010126 王燕《面向对象程序设计(Java)》第十六周学习总结
  5. lua-nginx-module directives 中文版
  6. Request登录案例
  7. 饼图大小调整_这么漂亮的双层饼图,你会做吗?让你工作汇报更出彩!
  8. php星期和时间获取
  9. 软件工程导论 统一建模语言UML概述
  10. JSON Server在快速开发过程中的使用
  11. Phoenix命令及语法
  12. Presto为什么快
  13. 被讨厌的勇气:课题分离理论
  14. python获取字典第一个元素,从字典中获取第一个元素
  15. 旧手机先别扔,余承东:留着升级一下鸿蒙
  16. Java多线程不会的看这里,阿里第三版核心技术手册PDF全彩版
  17. PTA 520钻石争霸赛题解
  18. RabbitMQ问题排解
  19. 这可能是实现高斯模糊(毛玻璃)最简单的库了
  20. 基于51单片机的温度报警系统

热门文章

  1. GitHub 热榜:中国博士开发可交互全球疫情地图,登上柳叶刀!
  2. 28本实体书包邮免费送!年前替我领回家!
  3. Python设计模式-外观模式
  4. golang的临时对象池sync.Pool
  5. not syncing : corrupted stack end detected inside scheduler解决办法 以及高版本的激活码!
  6. 微软资深算法工程师为AI初学者量身打造的机器学习入门书上市啦!
  7. 笔记 | 深入理解Transformer
  8. 浅谈先验分布和后验分布
  9. 项目实践 | 行人跟踪与摔倒检测报警
  10. 深入剖析Kubernetes k8s