java中Class.forName方法的作用详解

NVIDIA NCCL 源码解析:从XML拓扑到高性能通信图的构建 本文深入解析了NVIDIA NCCL如何将XML硬件拓扑文件转化为高性能通信图的核心过程。详细阐述了从创建CPU、GPU、NIC等节点,到建立PCIe、NVLink连接,再到计算链路带宽并进行关键排序的完整建图流程。该图是NCCL实现最优通信路径规划、充分发挥NVLink等高速互联性能的基石,直接影响分布式深度学习训练的效率。 阅读详情

转载:https://www.jb51.net/article/117468.htm
前言
在做JAVA EE开发的过程中,更多的是使用框架来提高开发效率.越来越发现,之前很基础的一些东西,都忘记的差不多了.从今天开始慢慢的复习一下基础.今天在看JDBC的时候,就有一个有趣的地方,之前学的时候,也没在意.这个Class.forName究竟是什么鬼.

import com.mysql.jdbc.Driver;
  
import java.sql.*;
  
/**
 * @author honway.liu
 * @date 2016/12/8 下午11:07
 * @email gm100861@gmail.com
 * @blog http://linuxsogood.org
 */
public class JdbcDemo {
  
 public static void main(String[] args) throws SQLException, ClassNotFoundException {
 //低版本使用
//  String url = "jdbc:mysql://127.0.0.1:3306/mydb";
  //高版本使用
 String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false";

  String username = "root";
  String password = "redhat";
   //低版本使用
  //Class.forName("com.mysql.jdbc.Driver");
   //高版本使用
   Class.forName("com.mysql.cj.jdbc.Driver");
  Connection connection = DriverManager.getConnection(url, username, password);
  String sql = "SELECT * FROM msg";
  PreparedStatement prepareStatement = connection.prepareStatement(sql);
  ResultSet resultSet = prepareStatement.executeQuery();
  while(resultSet.next()){  //列出全部数据-调整
  String address = resultSet.getString("address");
  System.out.println(address);
  }
 }
}

其中第一步,搞的我有点想不通.为啥Class.forName传入了一段字符串之后,就知道我连接的数据库是mysql? 有点不科学啊.Class.forName到底做了啥.下面就开始到源码中,一探究竟.

@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.
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

CUDA内核反汇编实战:用cuobjdump解锁SASS指令的奥秘 本文详细介绍了CUDA内核与SASS指令的关系,以及使用cuobjdump工具进行反汇编分析的方法。主要内容包括:1. CUDA内核的基本概念及其在GPU并行计算中的重要性;2. SASS指令作为底层汇编指令的关键作用;3. cuobjdump工具的安装配置和使用方法;4. 通过数组加法实例演示反汇编过程;5. 深入分析SASS指令格式、分类和执行流程;6. 两个实际案例展示性能优化和问题排查的应用。文章为开发者提供了深入理解CUDA程序底层执行机制的有效途径。 阅读详情

相关推荐

【数据结构】面试题整理 共36题

链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针。与数组不同,链表中的元素在内存中不必是连续存储的,这使得链表在插入和删除操作时非常高效。单向链表(Singly Linked List):每个节点只包含一个指向下一个节点的指针。双向链表(Doubly Linked List):每个节点包含两个指针,一个指向下一个节点,一个指向前一个节点。循环链表(Circular Linked List):链表的最后一个节点指向第一个节点,形成一个环。

weixin_44329069的博客 7198

Class.forName()的作用与使用总结

1、Class类简介: Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。 Class 没有公共构造方法。Class 对象是在加载类时由Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的,因此不能显式地声明一个Class对...

u014191624的博客 1103

【人工智能】AI算法系统设计与算法建模的详细阐述

AI算法系统设计与算法建模是人工智能领域中的核心任务之一,它涉及从问题定义、数据收集、算法选择、模型构建到系统部署的全过程。以下是对AI算法系统设计与算法建模的详细阐述

weixin_51306394的博客 4355

浅谈Class.forName()在JDBC中的作用

Class.forName()在JDBC中的作用

Robin的博客 2833

SAP-FICO LSMW实战:批量导入财务凭证与固定资产主数据(AS91)的完整指南

本文详细介绍了SAP-FICO中LSMW工具在批量导入财务凭证与固定资产主数据(AS91)的完整流程与实战技巧。从基础概念、环境准备到财务凭证导入全流程,特别针对AS91历史资产导入的日期逻辑和关键字段映射提供了专项指南,并分享了常见错误排查与性能优化建议,帮助用户高效完成SAP数据迁移任务。

weixin_29230649的博客 505

手把手教你用三菱PLC控制JET伺服原点:从硬件接线到GXWORKS3程序调试

本文详细介绍了如何使用三菱PLC控制JET伺服系统实现原点回归功能,涵盖硬件接线、参数配置到GX Works3程序调试的全流程。通过实战指南,帮助工程师快速掌握伺服控制技术,提升工业自动化项目的实施效率。

weixin_30642561的博客 535

forname java_java中forName()的作用

Class.forName(xxx.xx.xx) 返回的是一个类在java里面任何class都要装载在虚拟机上才能运行。这句话就是装载类用的(和new 不一样,要分清楚)。至于什么时候用,你可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?只有你提到的这个方法了,不过要再加一点。A a = (A)Class.forName("pacage.A").newInsta...

weixin_39710179的博客 888

Grok-1.5+Ollama企业级本地化部署与合规实践指南

本文详细介绍了Grok-1.5+Ollama企业级本地化部署与合规实践指南,重点分析了本地化部署的成本优势和数据主权保障。通过RTX 4090显卡的硬件选型、Ubuntu 22.04系统优化及部署流程中的关键陷阱规避,为企业提供了高效、安全的AI模型部署方案。特别适合金融、医疗等敏感行业。

weixin_29094539的博客 182

Class.forName()用法详解

主要功能 Class.forName(xxx.xx.xx)返回的是一个类 Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类, 也就是说JVM会执行该类的静态代码段 下面,通过解答以下三个问题的来详细讲解下Class.forName()的用法。 一.什么时候用Class.forName()? 先来个热身,给你一个字符串变量,它代表一个类的包名和类名,你怎么实

Kaiwii的专栏 13万+

Vscode + QT + CMake:高效开发环境搭建全攻略

本文详细介绍了如何搭建Vscode+QT+CMake高效开发环境,涵盖环境安装、配置优化及项目创建全流程。通过整合Vscode的轻量化编辑、QT的跨平台GUI开发以及CMake的现代构建管理,该组合特别适合大型QT项目和跨平台开发团队,能显著提升开发效率。

weixin_30338481的博客 504

新手必看:四旋翼无人机PID调参实战指南(附常见问题排查)

本文为四旋翼无人机新手提供PID调参实战指南,详细解析Kp、Ki、Kd参数的实际意义及调参技巧,包含常见问题排查方法。通过系统化的调参流程和实用参考表,帮助用户快速掌握无人机飞行控制核心技能,避免常见错误,提升飞行稳定性与响应性能。

k0l1m2n3o的博客 600

Class.forName底层原理

Class Class.forName public static Class<?> forName(String name, boolean initialize, ClassLoader loader) throws ClassNotFoundException { Class<?> caller = null; SecurityManager sm =

kongkong的专栏 1395

第42章:BRepBuilderAPI_MakeEdge(构建边)

是 OpenCascade 中用于构建边(Edge)的类。边是几何建模中的基本元素之一,通常连接两个顶点,并且可以有不同的几何形式,如直线、圆弧、样条曲线等。提供了多种创建边的方法,包括通过给定两个顶点、通过参数化曲线、通过给定起始和结束点的方式等。方法说明示例使用两个顶点创建直线边使用Geom_Curve创建边使用两点的坐标创建边Shape()获取创建的边。

yumeiguo的博客 183

forname java_java中Class.forName方法的作用详解

前言在做JAVA EE开发的过程中,更多的是使用框架来提高开发效率.越来越发现,之前很基础的一些东西,都忘记的差不多了.从今天开始慢慢的复习一下基础.今天在看JDBC的时候,就有一个有趣的地方,之前学的时候,也没在意.这个Class.forName究竟是什么鬼.连接数据库几大步.看以下代码import com.mysql.jdbc.Driver;import java.sql.*;/*** @au...

weixin_33410492的博客 359

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java 反射的实现三种方式

反射的优点缺点,定义及其实现三种方式

tszc95的博客 847

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

java中Class.forName的作用

Class.forName(xxx.xx.xx) 返回的是一个类     一.首先你要明白在java里面任何class都要装载在虚拟机上才能运行。       1. forName这句话就是装载类用的(new是根据加载到内存中的类创建一个实例,要分清楚)。            至于什么时候用,可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?

ysh06201418的专栏 5224

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java之Class.forName方法详解

一、前言: 在说明Class类的静态方法forName()之前,先清楚有关Class类的几个概念: 1、 Class类封装了类或接口的运行时状态 Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识,这些标示纪录了每个对象所属的类。 虚拟机通常使用运行时类型信息选择正确方法去执行,用来保存这些类型信息的类是Class类。 2、Class类型的对象,是加载类时自动创建的 Class 没有公共构造方法。Class 对象是在加载类时,由Java 虚拟机以及通过调用类加载器中的 defi

liu_chenglong的博客 6451

java下Class.forName的作用是什么,为什么要使用它

 java下Class.forName的作用是什么,为什么要使用它返回与带有给定字符串名的类或接口相关联的 Class 对象。调用此方法等效于:Class.forName(className, true, currentLoader)其中 currentLoader 表示此类的定义类加载器。例如,以下代码片段返回 java.lang.Thread 类的运行时 Class 描述符。Class t =...

青鸟飞鱼 6764

class.forName()详解

class.forName()方法的作用: 它的作用就是按参数中指定的字符串形式的类名去搜索并加载相应的类,如果该类字节码已经被加载过,则返回代表该字节码的Class实例对象,否则,按类加载器的委托机制去搜索和加载该类,如果所有的类加载器都无法加载到该类,则抛出ClassNotFoundException。加载完这个Class字节码后,接着就可以使用Class字节码的newInstance方法去创...

qq_43668119的博客 9230

Class.forName()方法详解

1、Class类简介:  Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识。这项信息纪录了每个对象所属的类。虚拟机通常使用运行时类型信息选准正确方法去执行,用来保存这些类型信息的类是Class类。Class类封装一个对象和接口运行时的状态,当装载类时,Class类型的对象自动创建。       Class 没有公共构造方法。Class 对象是在加载类时由

IT_wjj的博客 7953

Class.forName()方法的作用

一、Class.forName()方法的源代码以及注释 /** * Returns the {@code Class} object associated with the class or * interface with the given string name. Invoking this method is * equivalent to: ...

你倒是敲代码鸭. 731

class.forname的作用

原 Class.forName的作用以及为什么要用它 2016年02月26日 21:32:17 韩正阳 阅读数 4934 ...

wanwenjieGood的博客 1429

Java类class forName()方法及示例

类类forName()方法 (Class class forName() method) forName() method is available in java.lang package. forName()方法在java.lang包中可用。 forName() method is used to return the class object for the Class with the ...

cumtb2002的博客 1543
上一篇: 关于MySql链接url参数的设置
下一篇: Oracle授权相关(Oracle 触发器授权、Oracle 存储过程授权、Oracle 表授权、Oracle 序列授权)
小小馬寧
博客等级 码龄16年 13粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值