ClassLoader小结

类加载机制:  
创建自定义的类加载器,只需要扩展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(); 
在内存中的表示如下图。 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值