理解Class.forName()

news/2024/5/18 21:49:23 标签: classloader, class, jdbc, ejb, 数据库
class="baidu_pl">
class="article_content clearfix">
class="htmledit_views">


----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

原文地址:http://www.yanwushu.com/post/55.html

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


对于大部分人来说,第一次见到class.forName(String className)这句代码应该是在使用jdbc方式连接数据库的时候。但这句代码本质上是什么含义,做了什么工作呢?本文将回答此问题。

理解Class.forName方法需要一些知识铺垫,也就是Class类的概念和类加载的概念,强烈建议参考下《类的生命周期》(http://www.yanwushu.com/post/54.html)。

Class类概念

Class类用来描述一个类的结构,比如描述一个类有哪些成员,有哪些方法等。有多种方法可以获取一个类对应的Class类实例,比如:

class="language-java">//第一种方式获取描述Dog类结构的Class类实例
Class<Dog> clazz = Dog.class;
//第二种方式
Dog d = new Dog();
Class<Dog> clazz = d.getClass();


类加载概念


当使用一个类的时候(比如new一个类的实例),jvm会检查此类是否被加载到内存,如果没有,则会执行加载操作,加载操作的内容是,读取类对应的class文件数据,解析此数据,构造一个此类对应的Class类的实例,此Class类的实例描述了类的结构,并且提供了调用此类成员的接口。此时jvm就可以使用该类了,比如实例化此类,或者调用此类的静态方法。

java也提供了手动加载类的接口,class.forName()方法就是其中之一。

初始化参数指定的类,并且返回此类对应的Class实例。

类初始化概念

类被加载之后,jvm已经获得了一个描述类结构的Class实例。但是还需要进行类初始化操作之后才能正常使用此类,类初始化操作就是执行一遍类的静态语句,包括静态变量的声明还有静态代码块。

Class.forName方法

此方法含义是:加载参数指定的类,并且初始化它。

jdbc连接数据库中的应用

到这里,不用解释,读者也会明白,在使用jdbc方式连接数据库时,为什么要执行Class.forName('驱动类名')方法了:将驱动类的class文件装载到内存中,并且形成一个描述此驱动类结构的Class类实例,并且初始化此驱动类,这样jvm就可以使用它了,这就是Class.forName()方法的含义。

(参考《jdbc注册驱动的三种方式》http://blog.csdn.net/yanwushu/article/details/7574708),

资源

1. http://www.iteye.com/topic/15039

2. Class.forName和ClassLoader.loadClass的比较 http://blog.csdn.net/lu7kang/article/details/5576043



http://www.niftyadmin.cn/n/736684.html

相关文章

Hibernate实体映射配置1(java@注解方式)

实体和数据库之间存在某种映射关系&#xff0c;hibernate根据这种映射关系完成数据的存取。在程序中这种映射关系由映射文件&#xff08;*.hbm.xml&#xff09;或者java注解()定义。 本文以java注解的形式总结映射关系配置。 实体类组件以及注解标签映射关系 实体类----------…

理解ThreadLocal(线程局部变量)

ThreadLocal&#xff08;线程局部变量&#xff09;概述 ThreadLocal是什么呢&#xff1f;其实ThreadLocal并非是一个线程的本地实现版本&#xff0c;它并不是一个Thread&#xff0c;而是threadlocalvariable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量…

log4j使用快速入门

1.引言 在应用程序中添加日志记录总的来说基于三个目的&#xff1a; .监视代码中变量的变化情况&#xff0c;周期性的记录到文件中供其他应用进行统计分析工作 .跟踪代码运行时轨迹&#xff0c;作为日后审计的依据 .担当集成开发环境中的调试器的作用&#xff0c;向文件或控制…

java资源国际化之常用类

本文转自http://xa-zbl.iteye.com/blog/249386 国际化(Internationalization&#xff0c;又称il8n)&#xff0c;是越来越多的应用软件必须面临的问题&#xff0c;Java语言采用Unicode编码&#xff0c;并且提供了强大的类库支持国际化编程。采用Java语言编程&#xff0c;可以方…

Jstl国际化标签库的介绍

本文转自http://xa-zbl.iteye.com/blog/249386 I18N formatting 标签库用于在 JSP 页面中做国际化的动作。在该标签库中的标签一共有 12 个&#xff0c;被分为了两类&#xff0c;分别是&#xff1a; 国际化核心标签&#xff1a; <fmt:setLocale>、<fmt:bundle>、…

在Spring中进行国资源际化配置

本文转自http://xa-zbl.iteye.com/blog/249386 1、首先我们要准备资源文件 messages.properties 作为默认的资源文件&#xff0c;另外准备了3个版本的资源文件&#xff1a;messages_en_US.properties messages_zh_CN.properties messages_zh_TW.properties。放在class-path也…

Struts2自定义拦截器

Struts2提供面向切面编程&#xff08;AOP Aspect-Oriented Programing&#xff09;。在Struts2中拦截器是一种成熟的AOP的实现。 拦截器(Intercaptor)在Action前后执行。 类似于Filter Chain(过滤器链)&#xff0c;多个拦截器组成拦截器栈(Inteceptor stack)。 拦截器和Filte…

在Action中获取servlet API(1)

Struts2的Action组件是不依赖servlet API 的。那么当你在action中的业务需要处理HttpServletRequest和HttpServletResponse的时候&#xff08;比如要对响应做处理写cookie&#xff0c;生成验证码&#xff09;怎么办呢? 有3种办法可以实现action中获取servlet api 1.使用Servle…