Classloader 有3个作用

  • 将class加载到JVM中去
  • 审查每个类由谁去加载,是一种父优先的等级加载
  • 把Class字节码统一编译成JVM统一要求的对象格式

ClassLoader的等级加载机制

  • bootstrapClassloader :JVM自带的加载自己的工具,既没有更高一级的有没有子一级的加载器
  • ExtClassLoader : 主要是加载 System.getProperty("java.ext.dirs")目录下的内容,既不是纯正JVM内部也不是真正的外部类加载器。
  • AppClassLoader:他的父类就是ExtClassLoader 负责外部类加载,服务 System.getProperty("java.class.path")里面的内容,也就是我们所说的classpath目录

JVM加载class到内存中的两种方式

  • 显示加载:代码通过ClassLoader类来加载 调用loadClass()和getSystemClass;或者Class类的 Class.forName();又或者我们自己实现的findClass()方法
  • 隐式加载:如果我们在调用或者使用某个类时,不存在当前类内存是,JVM就自动去加载这个类

如何加载class文件

  • 第一步:首先找到这个class文件,然后class文件字节码 加载到JVM内存中。
    其实抽象类ClassLoader并没有定义如何去读取class文件,而是通过其子类URLClassLoader去实现他的findClass()方法,在URLCLassLoader中通过URLClassPath类的
帮助才能获取到class文件路径,然后在读取他的字节流,最有通过调用defineClass()来创建类。
  • 第二步:首先进行字节码验证、然后class数据结构分析、最后响应的内存分配和字符表连接。
  • 第三步:静态属性初始化和静态块的执行。

常见加载类的错误

  • ClassNotFoundException: 初学者在编写jdbc 加载驱动时,常用 Class.forName("指定的路径");的写法去加载一个类,这个方法通过指定的路径classpath路径下去找这个 类的路径,找不到就去检查路径。除了Class.forName()的方法,还有2中显示加载类的方式,一种是ClassLoader.loadClass()方法,另一种是ClassLoader.findSystemClass()方法。如果想要获取当前classpath的路径可以使用:this.getClass().getClassLoader().getResource("").toString()来获取;
  • ClassCastException:类型转换异常,这个很常见错误,解决和避免这个错误,有如下几个点:

    1、使用容器类时显示指出容器所包含的类型,如Map<String,Integer> map = new HashMap<String,Integer>()

    2、先通过instanceOf()方法检查是不是要转换的目标类型,然后再去进行强转。
  • NotCLassDefFoundError: 在JVM规范中,定义了出现该错误的原因是:使用new关键词、属性引用某个类、类继承了某个类实现某个接口、或者方法的参数里使用了某个类。这是会出发JVM隐式加载某个类找不到。解决办法是确认每个类都在classpath的路径下。
  • UnsatisfiedLinkError :这个错误可能是将某个JVM里的lib删掉了报的错。例如写了个JVM不错的library:System.loadLabriry("fuckKKK");就会报这个java.lang.UnsatisfiedLinkError.
  • ExceptionInIntializerError:JVM规范中指出,如果初始化器抛出了一些既不是Error也不是Exception的子类,就会创建一个ExceptionInIntializerError新实例,并用Exception 作为参数

最新文章

  1. 无限级ddsmoothmenu菜单实例
  2. Javascript中数组方法和方法的扩展
  3. 容器化redis高可用方案
  4. isDebugEnabled有什么用?
  5. 2016 - 1 - 22 HTTP(二)
  6. python3 学习总结与建议
  7. [ES6] 23. Rest Parameters &amp; Spread Parameters
  8. [Android学习笔记]ScrollView的使用
  9. 【转】.net IL 指令解释速查
  10. 为什么要重写equals和hashCode
  11. LA2965 n个数中选出最多个数异或和为0
  12. Python学习笔记开篇
  13. CSS3 3D立方体效果
  14. 对于一个段错误(核心已转储)问题的解答,错误的英文翻译是segment fault(core dumped)
  15. Windows下安装Confluence并破解汉化
  16. Android 屏幕适配问题分析
  17. SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase] 错误
  18. .apply()用法和call()的区别
  19. POJ-1456 Supermarket 销售商品【贪心】+【并查集】
  20. Java查找出现的单词

热门文章

  1. 设计自用的golang日志模块
  2. OpenJudge计算概论-分数求和
  3. css 百分比减去像素
  4. int 和String之间的相互转换
  5. ios排序NSArray(数字.字符串)
  6. ansible软件部署
  7. pod install [!] Unable to find a specification for `XXX`
  8. END使用
  9. mysql为字段添加或删除自增属性
  10. 细说SQL Server中的加密