JAVA虚拟机加载类的三种方式
来源:互联网 发布:捷通数据机房题目 编辑:程序博客网 时间:2024/05/18 00:56
http://blog.csdn.net/zhangzeyuaaa/article/details/12706241
虚拟机加载类的途径
1、由 new 关键字创建一个类的实例
2、调用 Class.forName() 方法
3、调用某个 ClassLoader 实例的 loadClass() 方法
三者的区别:
1和2使用的类加载器是相同的,都是当前类加载器。(即:this.getClass.getClassLoader)。3由用户指定类加载器。如果需要在当前类路径以外寻找类,则只能采用第3种方式。第3种方式加载的类与当前类分属不同的命名空间。另外,1是静态加载,2、3是动态加载
静态加载的时候如果在运行环境中找不到要初始化的类,抛出的是NoClassDefFoundError,它在JAVA的异常体系中是一个Error
动态态加载的时候如果在运行环境中找不到要初始化的类,抛出的是ClassNotFoundException,它在JAVA的异常体系中是一个checked异常
Class.forName与ClassLoader.loadClass区别
Class的装载包括3个步骤:加载(loading),连接(link),初始化(initialize).
Class.forName(className)实际上是调用Class.forName(className, true, this.getClass().getClassLoader())。第二个参数,是指Class被loading后是不是必须被初始化。
ClassLoader.loadClass(className)实际上调用的是ClassLoader.loadClass(name, false),第二个参数指Class是否被link。
Class.forName(className)装载的class已经被初始化,而ClassLoader.loadClass(className)装载的class还没有被link。一般情况下,这两个方法效果一样,都能装载Class。但如果程序依赖于Class是否被初始化,就必须用Class.forName(name)了。
例如,在JDBC编程中,常看到这样的用法,Class.forName("com.MySQL.jdbc.Driver").
如果换成了getClass().getClassLoader().loadClass("com.mysql.jdbc.Driver"),就不行。
com.mysql.jdbc.Driver的源代码如下:
// Register ourselves with the DriverManager
static {
}
原来,Driver在static块中会注册自己到java.sql.DriverManager。而static块就是在Class的初始化中被执行。
所以这个地方就只能用Class.forName(className)。
对于相同的类,JVM最多会载入一次。但如果同一个class文件被不同的ClassLoader载入,那么载入后的两个类是完全不同的。因为已被加载的类由该类的类加载器实例与该类的全路径名的组合标识。设有 packagename.A Class ,分别被类加载器 CL1 和 CL2 加载,所以系统中有两个不同的 java.lang.Class 实例: <CL1, packagename.A> 和 <CL2, packagename.A>。
- JAVA虚拟机加载类的三种方式
- JAVA虚拟机加载类的三种方式
- JAVA虚拟机加载类的方式解析
- JAVA虚拟机加载类的方式解析
- JAVA虚拟机加载类的方式解析
- JAVA虚拟机加载类的方式解析
- 剖析JAVA虚拟机加载类的方式
- Java虚拟机类加载方式
- java加载文件的三种方式
- java加载配置文件的三种方式
- 类加载的三种方式
- 类加载的三种方式比较
- 加载类的三种方式详解
- JAVA 加载文件的三种方式的区别
- 简述java加载资源文件的三种方式
- 虚拟机的三种联网方式
- 虚拟机NetworkAdapter三种方式的区别
- 虚拟机NetworkAdapter三种方式的区别
- Cookie-free Domains(为什么将静态图片,js,css存放到单独的域名?)
- CALayer与UIView对比
- Android沉浸式状态栏SystemBarTint的使用方法
- 深度学习:基于 Gensim 的 Yelp 评论文本分类实例
- 响应式编程简介
- JAVA虚拟机加载类的三种方式
- Android技术之View的事件分发机制和滑动冲突解决方案
- 程序员常去的个顶级开发社区
- 排序算法总结
- rem使用的js代码
- 新书《AngularJS半知半解》预热!
- iOS程序开发引用的第三方库之间出现冲突的处理方法
- 主键、外键,主表、从表
- PCIe总线学习笔记(一、PCI基础知识简介)