类加载器ClassLoader

java中的类加载器作用:将java类的字节码加载到java虚拟机(JVM)中。


bootstrap:虚拟机的内置类加载器(称为 "bootstrap class loader")本身没有父类加载器,但是可以将它用作 ClassLoader 实例的父类加载器,也就是类加载器的父类加载器。


ExtClassLoader:负责记载G:\Java\jdk1.6.0\jre\lib\ext\*.jar下的类。(这里的路径是我安装jdk的路径)。


AppClassLoader:负责加载classpath路径下的类。


自定义类加载器:(自定义加载路径)

class 类名 extends ClassLoader {    public Class findClass(String name) {
             byte[] b = loadClassData(name);    //通过字节码数组转换为Class类实例
             return defineClass(name, b, 0, b.length);
         } //获取字节码数组(自定义的)
         private byte[] loadClassData(String name) {
            
         }     }

自定义的类加载器可以将java代码混淆,也就是编译源码的时候先通过自己定义的加密规则编译,然后类加载器加载类的时候按照解密规则加载,这样可以增加代码的安全性,但是加载效率降低了。

类加载器使用委托机制加载类的,每个 ClassLoader 实例都有一个相关的父类加载器。需要查找类或资源时,ClassLoader 实例会在试图亲自查找类或资源之前,将搜索类或资源的任务委托给其父类加载器。我的理解是这样的:假如我们要加载一个类,那么我们是不是应该先加载一个类加载器呢?而我们类加载器的加载是不是也需要一个类加载器去加载它,才会创建一个他的实例去供java虚拟机调用并加载其他的类,所以加载一个类的时候是从bootstrap——>extclassload——>appclassloader——>自定义类加载器,从上往下开始去加载这个类的,如果类加载器找到了就会返回这个类的实例,没有找到就会交给他的下一级去找。(注意:类加载的发起者不会交由它的子类去加载。假如是从appclassloader发起的,那么如果在appclassloader类加载器还没有找到这个类的,那么就会抛出找不到类的异常,而不会再交给它的子类去加载这个类)。




转载于:https://my.oschina.net/u/1183930/blog/638283

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值