利用Class.forName()将驱动类加载到JVM
来源:互联网 发布:yum y install wget 编辑:程序博客网 时间:2024/05/16 14:51
Class.forName()作用:
1、作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段。最熟悉的就是JDBC连接数据库的时候加载驱动类。注册一个数据库驱动,将驱动加载到当前的JVM中。Class.forName(xxx.xx.xx)返回的是一个类,如在Java中,JDBC连接数据库操作,用该方法加载驱动类
2、反射,可以动态获取一个类的方法、属性、构造方法等信息,可以动态创建类
另外:Class.forName(Stringpath)方法可根据我们给定的类全限定名来加载这个类文件到内存中,并返回给我们一个java.lang.Class类的实例,这个Class类就是我们加载的那个类文件在java中的模拟,通过Class类的实例,我们可以获得它的方法、构造器、反射的实例化获得实例,再通过实例反射调用其方法等。反射算是java独特的一个功能,用处很大。
比如在jdbc中需要用到这一步将数据库驱动进行加载,由于我们使用jdbc时往往没有显式的使用驱动包中的任何类,所以类加载器是不会去加载驱动的。一个插曲:
为了验证不用Class.forName也可加载驱动,我显式的引入了驱动包中的oracle.jdbc.OracleDriver这个类,并打印出这个类的staticfinal常量“batch_string”,却发现DriverManager仍旧没有找到驱动,查看其源码后写了个测试才发现,所有的jdbc驱动都是通过静态代码块来调用DriverManager工具类的registerDriver方法,来向DriverManager这个驱动管理器进行注册,但类文件在被类加载器加载时并不会马上执行static静态代码块,而是在必须要初始化时才执行(比如访问其静态变量、实例化等操作),而我打印的“batch_string”正好是个final的常量,无需初始化,所以静态代码块未执行,向DriverManager注册驱动的步骤也就没有做。后来我直接调用了OracleDriver的静态方法isDebug(),其静态代码块才得以执行。
补充:
1:Class.forName在这里的作用是将驱动类加载到JVM中,实际上就是执行这个驱动类中的一段static静态块。因为Class.forName后该类的静态块会被执行,所以这么写。而实际上你直接将这个驱动类new对象实例化也可以达到这个效果。但这样不利于动态读取配置文件创建连接,因此一般都使用Class.forName的形式。
- 利用Class.forName()将驱动类加载到JVM
- JVM虚拟机加载类到内存的ClassLoader.loadClass && Class.forName()的比较
- jdbc加载驱动 Class.forName()的作用
- Java中class是如何加载到JVM中的(Class.forName("name")和ClassLoader.loadClass("name")的区别)
- 1. Class.forName("com.mysql.jdbc.Driver");//加载数据库驱动
- Class.forName加载mysql驱动总是产生ClassNotFoundException异常
- JDBC采用Class.forName加载驱动的意义
- 为什么加载数据库驱动只用Class.forName()
- java中动态加载类 Class.forName
- Class.forName加载JDK类(Srtring)
- Java中的类加载和Class.forName()
- 类加载机制之Class.forName()
- Java中class是如何加载到JVM中的(Class.forName("name")和ClassLoader.loadClass("name")的区别)
- Class.forName()、Class.forName().newInstance() 、New 三者区别! 终于明白为什么加载数据库驱动只用Class.forName()了!!困扰了我2个小时
- Class.forName()装载数据驱动
- Class.forName 动态加载
- jvm加载class类机制
- JVM类加载Class文件
- request得到访问者域名
- AE二次开发异常HRESULT:0x80041051解决办法
- 如何向妻子解释面向对象设计(OOD)
- UItextView让键盘退下的几种方法
- 字符集系列三之ISO8859_1、GBK、gb2312
- 利用Class.forName()将驱动类加载到JVM
- perror和strerror的区别
- 字符设备驱动详解
- OWL与描述逻辑
- Android中View绘制流程以及invalidate()等相关方法分析
- 常用正则匹配
- Speex之三--编译和移植
- ContentProvider和Uri详解
- linux下 安装 ImageMagick 及其 php imagick扩展