`
longxiaoyan
  • 浏览: 75899 次
  • 性别: Icon_minigender_1
  • 来自: 桂-京
社区版块
存档分类
最新评论

ClassLoader小结

    博客分类:
  • JVM
 
阅读更多
参考:圣思园视频 和 http://topmanopensource.iteye.com/blog/667229

类加载机制: 
创建自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的findClass(String name)方法即可。该方法根据参数指定的类的名称,返回它对应的Class对应的引用。 

由java虚拟机自带的类加载器所加载的类,在虚拟机的生命周期中,始终不会被卸载。java 虚拟机自带的类加载器包括根类加载器,扩展类加载器,系统类加载器。java虚拟机本身会始终引用这些类加载器,而这些类加载器则会始终引用它们所加载的类的Class对象。 

由用户自定义的类加载器所加载的类是可以被卸载的。在类的加载器的内部实现中,用一个java集合来存放所加载类的引用。另一方面,一个Class对象总是会引用它的类加载器。调用Class对象的方法。就能获取它的类加载器。
一个类的实例总是引用代表这个类的Class对象(反射)。在Object类中定义了getClass()方法, 这个方法返回代表对象所属类的Class对象的引用。此外所有的java类都有一个静态属性class,它引用代表这个类的class对象。 

在父委托机制中,各个加载器按照父子关系形成了树形结构。除了根类加载器以外其余的类加载器都有且只有一个父加载器。 
需要指出的是: 
加载器之间的父子关系实质上指的是加载对象之间的包装关系。而不是类之间的继承关系。一对父子关系加载器可能是同一个加载类的两个实例,也可能不是。在子加载器对象中包装了一个父加载器对象。
父委托机制的优点:提供了软件系统的安全性。因为在此机制下,用户自定义的类加载器不可能加载应该由父加载器加载的可靠类。从而防止不可靠的甚至恶意的代码代替父加载器的可靠代码。 

调用ClassLoader类的loadClass方法加载一个类,并不是对类的主动使用,不会导致类的初始化。
在类的加载阶段将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.class对象,作为方法区类对象的入口。

如以下代码:
Class clazz = loader1.loadClass(“sample”);
Object object = clazz.newInstance();
在内存中的表示如下图。

  • 大小: 41.2 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics