类加载机制

来源:互联网 发布:开源直播系统源码 编辑:程序博客网 时间:2024/06/14 22:56

--------------------------------------------------------------------------------------------------------
ClassLoader的类动态装载机制:
1.并非一次性装载
2.用到的时候,再装载(运行期间动态装载)
技巧,在Eclipse中观察类装载机制:
右键>运行方式>运行配置>自变量>VM自变量>-verbose:class(详细输出)
以上作用,等同于,在命令行中,java -verbose:class SomeClass
JDK内置的ClassLoader:
1.bootstrap
   最顶层的类装载器,用来装载JRE运行环境中的,最核心的类和其它的类装载器,比如rt.jar
System.out.println(String.class.getClassLoader());    //结果null
2.extension
   扩展类装载器,用来装载JRE扩展类,这些类放在jre7\lib\ext\目录下,
System.out.println(com.sun.crypto.provider.DESkeyFactory.class.getClassLoader().getClass());    //结果class sun.misc.Launcher$ExtClassLoader
3.application
   应用程序类装载器,用来装载用户自己写的类
System.out.println(Test.class.getClassLoader().getClass());   //结果class sun.misc.Launcher$AppClassLoader
System.out.println(ClassLoader.getSystemClassLoader().getClass());   //结果,同上,所以,"系统类装载器"就是应用程序类装载器.
4.other
   SecureClassLoader,URLClassLoader,等,用户还可以自定义自己的类装载器!
类装载器的实现方式:
1.顶层类装载器,是用本地语言(C,C++)写的,没有名字,不能调用,本身由虚拟机自动装载.
2.其它类装载器,都是用Java语言写的,都有名字,可以调用,这些类装载器本身,都是被顶层类装载器所装载的.
------------------------------------------------------------------------------------------------------------
类加载器的继承关系:
java.lang.Object
    |--java.lang.ClassLoader(抽象类)
          |--java.security.SecureClassLoader(类)
                |--java.net.URLClassLoader(类)
                     |--sun.misc.Launcher$ExtClassLoader(静态内部类)
                     |--sun.misc.Launcher$AppClassLoader(静态内部类)
注意,除了最顶层类装载器,所有其它的类装载器,都是从ClassLoader类继承而来的.
类加载器的层次关系(不是继承):
bootstrap
    |--ext(对象)
          |--app(对象)
                |--其它类加载器(对象)
                |--自定义类加载器(对象)
类加载器,加载类的过程:
1.首先查找上层,看是否已经加载,
2.已经加载,不再重复加载了,
3.没有加载,就加载.
结论:
安全性好,自己写的String.class永远没有机会加载!
ClassLoader抽象类中的方法:
public final ClassLoader getParent()
拿到这个类加载器对象的上一层的类加载器的对象(不是继承).
----------------------------------------------------------------------------------------------------
0 0
原创粉丝点击