`
programmer
  • 浏览: 76748 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

看深入JVM书的一点类初始化的疑惑

阅读更多
1.在书里我看到了说如果jdbc驱动被虚拟机加载了,但没有被连接和初始化,但是使用驱动程序的时候是通过
DriverManager类的静态方法注册的,所有jdbc驱动加载的时候必须要进行连接和初始化。这样才能使用驱动程序。否则将不能使用。
2.但是我又在书里看到了说,如果一个类被加载没有被连接和初始化,但当此类被主动使用的时候就会进行类的连接和初始化。什么情况时主动使用呢?其中调用一个类的静态方法就是之一。所以当使用DriverManager类的静态方法进行注册的时候应该就会初始化DriverManager类。
所有 对于第1点觉得很疑惑。


分享到:
评论
9 楼 小米CS 2007-06-07  
JDBC驱动是通过Class.forName()加载的,这个时候并没有调用驱动的任何方法(包括静态方法),所以这个时候只是加载了驱动类,并没有建立连接和做初始化动作
8 楼 faithful_czx 2007-06-07  
Class.forName(xxx.xx.xx);的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段.在JDBC规范中明确要求这个Driver类必须向DriverManager注册自己,即任何一个JDBC Driver的Driver类的代码都必须类似如下:
public class MyJDBCDriver implements Driver {
static {
DriverManager.registerDriver(new MyJDBCDriver());
}
}

所以我们在使用JDBC时只需要Class.forName(XXX.XXX);就可以了.
7 楼 likeblood 2007-06-07  
你去看看Class.forName的那个类的代码就知道,里面有个static{...}
6 楼 dennis_zane 2007-04-12  
programmer 写道
dennis_zane 写道
初始化DriverManager类与初始化jdbc驱动,你恐怕混淆了这个

首先DriverManager是jdbc驱动jar包里的一个类,难道加载jdbc驱动jar的时候不加载DriverManager吗?如果有加载就算没有连接和初始化,那么当第一次调用的时候也会连接和初始化DriverManager类,对不对。


请看清楚了,DriverManager是java.sql包的类,数据库驱动(比如com.mysql.jdbc.Driver)与DriverManager是两个不同的概念,有点汗。
5 楼 dovecat 2007-04-12  
你到底对第一点的哪个地方没明白呢?
4 楼 programmer 2007-04-12  
rainlife 写道
通过Class.forName()是用来加载JDBC驱动类的,注意 ,只是加载,并没有初始化。你可以看一下我的那个类加载器的帖子。
DriverManager类看了一下,最终会调用下面这个方法
 private static void loadInitialDrivers() {
        String drivers;
        try {
	    drivers = (String) java.security.AccessController.doPrivileged(
		new sun.security.action.GetPropertyAction("jdbc.drivers"));
        } catch (Exception ex) {
            drivers = null;
        }
        println("DriverManager.initialize: jdbc.drivers = " + drivers);
        if (drivers == null) {
            return;
        }
        while (drivers.length() != 0) {
            int x = drivers.indexOf(':');
            String driver;
            if (x < 0) {
                driver = drivers;
                drivers = "";
            } else {
                driver = drivers.substring(0, x);
                drivers = drivers.substring(x+1);
            }
            if (driver.length() == 0) {
                continue;
            }
            try {
                println("DriverManager.Initialize: loading " + driver);
                Class.forName(driver, true,
			      ClassLoader.getSystemClassLoader());
            } catch (Exception ex) {
                println("DriverManager.Initialize: load failed: " + ex);
            }
        }
    }

可以看到,最后也是通过DriverManager来初始化驱动,也是通过Class.forName()方法。

DriverManager类怎么初始化我们不用管,按道理来说只要加载DriverManager类所在的包就可以对不对!
3 楼 programmer 2007-04-12  
dennis_zane 写道
初始化DriverManager类与初始化jdbc驱动,你恐怕混淆了这个

首先DriverManager是jdbc驱动jar包里的一个类,难道加载jdbc驱动jar的时候不加载DriverManager吗?如果有加载就算没有连接和初始化,那么当第一次调用的时候也会连接和初始化DriverManager类,对不对。
2 楼 rainlife 2007-04-12  
通过Class.forName()是用来加载JDBC驱动类的,注意 ,只是加载,并没有初始化。你可以看一下我的那个类加载器的帖子。
DriverManager类看了一下,最终会调用下面这个方法
 private static void loadInitialDrivers() {
        String drivers;
        try {
	    drivers = (String) java.security.AccessController.doPrivileged(
		new sun.security.action.GetPropertyAction("jdbc.drivers"));
        } catch (Exception ex) {
            drivers = null;
        }
        println("DriverManager.initialize: jdbc.drivers = " + drivers);
        if (drivers == null) {
            return;
        }
        while (drivers.length() != 0) {
            int x = drivers.indexOf(':');
            String driver;
            if (x < 0) {
                driver = drivers;
                drivers = "";
            } else {
                driver = drivers.substring(0, x);
                drivers = drivers.substring(x+1);
            }
            if (driver.length() == 0) {
                continue;
            }
            try {
                println("DriverManager.Initialize: loading " + driver);
                Class.forName(driver, true,
			      ClassLoader.getSystemClassLoader());
            } catch (Exception ex) {
                println("DriverManager.Initialize: load failed: " + ex);
            }
        }
    }

可以看到,最后也是通过DriverManager来初始化驱动,也是通过Class.forName()方法。
1 楼 dennis_zane 2007-04-12  
初始化DriverManager类与初始化jdbc驱动,你恐怕混淆了这个

相关推荐

    java JVM 类加载-初始化 过程

    java JVM 类加载-初始化 过程

    Java虚拟机JVM类加载初始化

    Java虚拟机JVM类加载初始化是Java程序运行过程中的关键环节,它负责将类的字节码文件加载到内存中并进行相应的处理,以便程序能够正确执行。在Java中,类加载器(Classloader)扮演着核心角色。下面将详细讨论类加载...

    深入JVM内核—原理、诊断与优化视频教程-3.常用JVM配置参数

    其中,类加载子系统负责加载、验证、准备和初始化类文件;运行时数据区包括堆、栈、方法区、程序计数器和本地方法栈,它们各自承担着不同的职责,如存储对象实例、管理方法执行上下文等;执行引擎是JVM的心脏,它...

    深入JVM内核—原理、诊断与优化视频教程-2.JVM运行机制

    加载过程包括加载、验证、准备、解析和初始化五个阶段。类加载器主要有Bootstrap ClassLoader、Extension ClassLoader和App ClassLoader,它们遵循双亲委派模型,保证类的唯一性。 2. **内存区域划分**:JVM内存...

    深入JVM概要 JVM详解

    本文将详细介绍Java虚拟机(JVM)的内部机理和实现原理,从类型的生命周期、方法区、常量池、类加载器、垃圾收集器、栈和局部变量等方面对JVM进行深入解析。 类型的生命周期 类型的生命周期是JVM中最重要的部分,...

    深入java虚拟机(三)——类的生命周期(下)类的初始化1

    【深入Java虚拟机(三)——类的生命周期(下)类的初始化1】 类的生命周期在Java中是一个关键的概念,它涵盖了从加载到卸载的整个过程。在类的生命周期中,初始化阶段是非常重要的,因为它涉及到类的静态变量的赋值...

    深入jvm 内核-原理,诊断于优化视频教程

    ### 深入JVM内核:原理、诊断与优化 #### 一、JVM基础知识 **1.1 JVM概念** Java虚拟机(Java Virtual Machine,简称JVM)是一种用于执行Java字节码的虚拟机。它为Java程序提供了一个运行环境,能够独立于硬件平台...

    深入JVM内核—原理、诊断与优化

    《深入JVM内核—原理、诊断与优化》是一份深度探索Java虚拟机(JVM)的视频教程,旨在帮助开发者全面理解JVM的工作机制,掌握性能诊断技巧,并能进行有效的优化。本教程覆盖了从基础到高级的JVM主题,不仅适用于Java...

    深入理解jvm虚拟机

    类加载过程涉及加载、验证、准备、解析和初始化五个阶段。 3. 运行时数据区:JVM在执行Java程序的过程中,会将其划分成不同的区域以管理不同的数据。主要包括方法区(Method Area)、堆(Heap)、Java栈(Java ...

    深入JAVA虚拟机 随书源码 JVM规范

    类加载机制是JVM的重要特性,它包括加载、验证、准备、解析和初始化五个阶段。这个过程确保了类的安全性和正确性。双亲委派模型是类加载机制的一种实现,它避免了类的重复加载,并保证了类加载的有序性。 垃圾收集...

    深入理解JVM.

    深入理解JVM,首先要明白Java技术的组成部分,包括Java编程语言、Java类文件格式、Java虚拟机(JVM)和Java应用程序接口(Java API)。这些组件共同构成了Java平台,使得Java程序能够实现跨平台运行。 Java虚拟机是...

    JVM实战-JVM类加载机制案例分析

    通过实践操作,掌握类的加载、连接与初始化过程,了解不同类型的类加载器及其工作原理,学会创建自定义的类加载器,并对类的卸载有所认识。实验将结合具体的Java程序实例,运用单例模式对静态变量和对象进行初始化,...

    深入jvm虚拟机

    本书讲述了Java虚拟机一运行 所有Java程序的抽象计算机,还讲了几种与虚拟机密切相关的核心Java API。本书通过分析讲解、可运行的示例、参考资料和applet (它作为文中所述概念的交互式例示),提供了Java技术的深人...

    深入jvm内核-原理、诊断与优化教学视频

    1、java虚拟机的基本介绍。 2、字节码的执行 3、常用的jvm参数配置 4、算法和种类 5、gc参数配置 6、类加载器 7、性能监控工具 8、jvm堆栈分析

    深入JVM内核—原理、诊断与优化视频教程

    类的加载过程包括加载、验证、准备、解析和初始化五个阶段。 - **加载**:读取类的二进制数据到内存中。 - **验证**:确保加载的类信息符合当前运行环境的要求。 - **准备**:为类的静态变量分配内存,并设置初始值...

    Java静态初始化块和对象初始化块

    静态初始化块是以`static`关键字标识的代码块,它在类被加载到Java虚拟机(JVM)时执行,且只执行一次。静态初始化块常用于设置类级别的变量,或者执行只应执行一次的初始化操作。例如,如果一个类需要在程序运行前...

    深入Java虚拟机_002_深入详解JVM之类加载器深度剖析、根、扩展及系统类加载器

    主动使用包括:创建类的实例、访问类的静态变量、调用类的静态方法、反射方式加载类、子类的初始化会触发父类加载等。被动使用则是在JVM运行过程中,由于JVM或JDK内部需要而进行的加载,如JNI查找类、JDK工具类的...

Global site tag (gtag.js) - Google Analytics