为什么需要在取得jdbc连接之前,需要先去手动初始化驱动类
2011-06-16 18:53
501 查看
为什么会在取得JDBC连接之前,要有Class.forName("xxxx");这样的一句话,最近终于试验了一下。
在JAVA虚拟机中有两种方法栈,JAVA方法栈与本地方法栈,对于每个线程来说,都有一个PC寄存器,为一个字长,保存有下一步将要执行的指令,这是对于JAVA方法的调用来说的,而对于本地方法来说,PC寄存器中的值是不确定的,本地方法的实现依托于主机的实现。
在JAVA虚拟机中,有几种主动使用的情况,分别为产生对象,调用非编译时常量的类属性,调用类方法,调用类对应的class的某些反射方法,当初始化某个类的子类时,要求对应的父类也已经初始化了,当虚拟机启动某个已经被标明为启动类的时候。当遇到这六种情况的时候,JAVA类是需要初始化的。而对应的装载类就是调用它们的那个类的定义类装载器。可以用class.getClassLoader();取得。
但是今天发现,除了这一上的几种情况以外,Class.forName("xxxx");同样能够导致这个全限定名所代表的类的初始化,而不仅仅是装载,这个是我发现的除了一上的六种方法之外的第七种,有可能它在自己的方法里面同样使用了以上的六种方法中的某一种进行主动使用,以后有兴趣了可以看一下。
但是对于本地方法来说,JAVA虚拟机就是调用一下接口,而对本地方法的具体的执行没有控制权,所以当本地方法中需要去调用一个JAVA方法的时候,虚拟机不会对这个类进行初始化。
所以,在动态手动加载驱动类的时候,最重要的步骤不是装载,而是初始化,给类变量分配内存,我估计在本地方法调用的时候,使用的是直接寻址,所以导致错误。
在JAVA虚拟机中有两种方法栈,JAVA方法栈与本地方法栈,对于每个线程来说,都有一个PC寄存器,为一个字长,保存有下一步将要执行的指令,这是对于JAVA方法的调用来说的,而对于本地方法来说,PC寄存器中的值是不确定的,本地方法的实现依托于主机的实现。
在JAVA虚拟机中,有几种主动使用的情况,分别为产生对象,调用非编译时常量的类属性,调用类方法,调用类对应的class的某些反射方法,当初始化某个类的子类时,要求对应的父类也已经初始化了,当虚拟机启动某个已经被标明为启动类的时候。当遇到这六种情况的时候,JAVA类是需要初始化的。而对应的装载类就是调用它们的那个类的定义类装载器。可以用class.getClassLoader();取得。
但是今天发现,除了这一上的几种情况以外,Class.forName("xxxx");同样能够导致这个全限定名所代表的类的初始化,而不仅仅是装载,这个是我发现的除了一上的六种方法之外的第七种,有可能它在自己的方法里面同样使用了以上的六种方法中的某一种进行主动使用,以后有兴趣了可以看一下。
但是对于本地方法来说,JAVA虚拟机就是调用一下接口,而对本地方法的具体的执行没有控制权,所以当本地方法中需要去调用一个JAVA方法的时候,虚拟机不会对这个类进行初始化。
所以,在动态手动加载驱动类的时候,最重要的步骤不是装载,而是初始化,给类变量分配内存,我估计在本地方法调用的时候,使用的是直接寻址,所以导致错误。
相关文章推荐
- 从JDBC程序看为什么需要Mybatis
- 网络TCP建立连接为什么需要三次握手而结束要四次
- JAVA里面局部变量需要显式初始化,谁能解释编译器为什么这样设计?
- jdbc连接postgresl需要指明特定模式
- TCP建立连接为什么需要三次握手而结束要四次
- 网络TCP建立连接为什么需要三次握手而结束要四次
- TCP建立连接为什么需要三次握手
- 使用JDBC连接数据库需要哪四步
- BSS段为什么需要初始化
- TCP建立连接为什么需要三次握手而结束要四次
- 为什么局部变量必须手动赋值?而全局变量不用手动赋值也可以初始化?
- TCP连接建立过程中为什么需要“三次握手”
- 为什么U盘在拔出之前需要“安全弹出”?
- 连接n个字符串而重复的使用+,需要n的平方级别的时间?为什么?
- java中成员变量为什么需要初始化
- java的JDBC连接数据库需要的jar包
- 为什么TCP连接需要三次握手分开需要四次握手
- [jvm解析系列][九]类的加载过程和类的初始化。你的类该怎么执行?为什么需要ClassLoader?
- JDBC 初始化驱动 连接 执行sql语句 关闭连接
- TCP连接建立过程中为什么需要“三次握手”