Class类概念

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

  1. //第一种方式获取描述Dog类结构的Class类实例
  2. Class<Dog> clazz = Dog.class;
  3. //第二种方式
  4. Dog d = new Dog();
  5. Class<Dog> clazz = d.getClass();

加载


类加载的过程如下:

1. 将类对应.class文件中的二进制数据读到内存中,把它存放在运行时数据区的方法区内;

2. 在堆取创建一个Class实例,此实例

a) 描述了方法区内的数据结构

b) 提供了访问类在方法区内数据结构的接口,如下图所示:

可以简单的理解为:类加载的产品是一个Class类的实例。

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

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

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

Class类概念

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

  1. //第一种方式获取描述Dog类结构的Class类实例
  2. Class<Dog> clazz = Dog.class;
  3. //第二种方式
  4. Dog d = new Dog();
  5. 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()方法的含义。

最新文章

  1. udp--&gt;socket通信原理
  2. const放在函数前和放在函数后
  3. DSP280x的数模转换使用
  4. 转 wince程序 中使用Listview显示图标问题 (C#) .
  5. pku3277 City Horizon
  6. 一款纯css3实现的条纹加载条
  7. Unity NGUI实现Tabview
  8. 国内Android应用推广的六大主流方式
  9. 使用单元素的枚举类型实现Singleton
  10. 关于ajax 进行post提交 json数据到controller
  11. 极客时间 深入拆解java虚拟机 一至三讲学习总结
  12. Netty 系列二(传输).
  13. 【bug-劫持】深信服劫持
  14. HTTP redirect 重定向到 HTTPS
  15. 迁移桌面程序到MS Store(7)——APPX + Service
  16. Requests中出现大量ASYNC_NETWORK_IO等待
  17. django之创建第4个项目编写第一个动态模板文件
  18. 使用javacv录像,同时进行讯飞声纹认证
  19. 数据源与JNDI资源实现JSP数据库连接池实例
  20. 修改Intelij IDEA的maven依据下载为国内镜像(阿里)

热门文章

  1. 【转】 mysql使用federated引擎实现远程访问数据库(跨网络同时操作两个数据库中的表)
  2. NumPy v1.15手册汉化
  3. 学习HTML 第一节.小试牛刀
  4. tensorflow中tensor与数组之间的转换
  5. 二叉树的宽度&lt;java版&gt;
  6. NO.07--我跟“ 币乎 ”的那些事
  7. Git + Gerrit 操作备忘
  8. Halcon算子解释
  9. [T-ARA][너 때문에 미쳐][因为你而疯了]
  10. python 抓取网页(一)