java类加载器
2016-03-07 21:29
316 查看
一、什么是类加载器?
类加载器就是加载类的工具,当我们在java程序里面用到一个类,jvm首先将java的字节码.class文件加载到内存里面去,通常这些字节码是放在 classpath目录下。
二、jvm中的三个类加载器
jvm中可以安装过个类加载器,系统默认提供了三个主要的类加载器,每个类加载器负责加载特定位置的类。
类加载器也是java类,它是由BootStrap类加载器加载的。BootStrap不是一个java类,所以它不需要java类加载器加载。它是嵌套在jvm内核里面的,由c++写的一段二进制代码。当jvm启动时,它就加载了。
jvm给我们提供的三个类加载器分别是:BootStrap,ExtClassLoader,AppClassLoader,它们组成一个树状结构。我们还可以写自己的类加载器,挂到这个树上。
三、类加载器的委托机制
由当前线程的类加载器加载第一个类,如果这个类还引用了其他类,那么也是由加载第一个类的类加载器来加载引用的类。
还可以直接使用ClassLoader.loadClaa()来指定某个类加载器加载某个的类。
当我们派出第一个类加载器加载第一个类时,它会交给上一级类加载器,上一级继续交给上一级,直到到达顶级类加载器,然后再去找,找不到时,再往下退一级去找,如果退到第一个派出的类加载器时,仍然找不到,就报异常了。这样的好处是可以集中管理,不会出现多份字节码的现象。
四、你能不能自己写一个类,叫java.lang.System?
通常不可以,原因是委托机制会交给BootStrap去找java.lang.System,它会在jre/lib/rt.jar中找到java.lang.System,所以并不会加载到我们自己写的java.lang.System。当然我们可以自己写一个类加载器,不委托给上级,指定加载我们的类。
类加载器就是加载类的工具,当我们在java程序里面用到一个类,jvm首先将java的字节码.class文件加载到内存里面去,通常这些字节码是放在 classpath目录下。
二、jvm中的三个类加载器
jvm中可以安装过个类加载器,系统默认提供了三个主要的类加载器,每个类加载器负责加载特定位置的类。
类加载器也是java类,它是由BootStrap类加载器加载的。BootStrap不是一个java类,所以它不需要java类加载器加载。它是嵌套在jvm内核里面的,由c++写的一段二进制代码。当jvm启动时,它就加载了。
jvm给我们提供的三个类加载器分别是:BootStrap,ExtClassLoader,AppClassLoader,它们组成一个树状结构。我们还可以写自己的类加载器,挂到这个树上。
三、类加载器的委托机制
由当前线程的类加载器加载第一个类,如果这个类还引用了其他类,那么也是由加载第一个类的类加载器来加载引用的类。
还可以直接使用ClassLoader.loadClaa()来指定某个类加载器加载某个的类。
当我们派出第一个类加载器加载第一个类时,它会交给上一级类加载器,上一级继续交给上一级,直到到达顶级类加载器,然后再去找,找不到时,再往下退一级去找,如果退到第一个派出的类加载器时,仍然找不到,就报异常了。这样的好处是可以集中管理,不会出现多份字节码的现象。
四、你能不能自己写一个类,叫java.lang.System?
通常不可以,原因是委托机制会交给BootStrap去找java.lang.System,它会在jre/lib/rt.jar中找到java.lang.System,所以并不会加载到我们自己写的java.lang.System。当然我们可以自己写一个类加载器,不委托给上级,指定加载我们的类。
相关文章推荐
- java int,string,char三种类型变量之间的互相转换
- Netbeans jdkhome 配置
- 二叉树的镜像
- 公共技术点之 Java 注解 Annotation
- Java——private default protected public访问控制权限
- java并发编程实战学习(3)--基础构建模块
- Java之泛型基础
- SpringMVC的工作流程
- 3.6 java基础总结①包装类,基本数据类型,String相互间转换
- Java日期
- 解决java.lang.NoClassDefFoundError: ch/qos/logback/core/joran/spi/Pattern
- spring使用DataSoure注入参数时报No supported DataSource type found
- java 正则表达式
- 排序算法之希尔排序(java实现)
- 使用 Java API 操作 HBase
- 从爬取湖北某高校hub教务系统课表浅谈Java信息抓取的实现 —— import java.*;
- java里的静态变量是放在了堆内存还是栈内存?
- Java设计模式之访问者模式
- 2016蓝桥杯假期任务之《回文数字》
- Struts2的ModelDriven