类加载器


ClassLoad:类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class 类的一个实例。

类加载机制
记载,验证,准备,解析,初始化,使用,卸载

类加载器分为三个
Bootstrp loader,ExtClassLoader,AppClassLoader
Bootstrp loader:主要加载 jre/lib 、jre/class 、-Xbootclasspath参数指定的路径

那么为什么三个类加载器呢?因为它们代表三个层次的信任。最值得信任的类是核心API类。接下来是已安装的扩展,然后是类路径中显示的类,这意味着它们是您的计算机的本地。


ExtClassLoader:ExtClassLoader由Bootstrp loader加载,并将ExtClassLoader的父加载器设置为Bootstrp loader,主要加载jre/lib/ext下的类库

AppClassLoader :Bootstrp loader加载完ExtClassLoader后,就会加载AppClassLoader,并将ClassLoader父加载器指定为ExtClassLoader,ClassLoader有个方法getSystemClassLoader,此方法返回的正式AppClassLoader.AppClassLoader主要负责加载Classpath所指定的位置的类

在java中类加载器把一个类装入JVM经过以下步骤
1.查找和导入class文件 2,检查class文件的正确性 3.给类的静态变量分配空间 3,将符号应用转换为直接引用 4.对静态变量和静态代码块执行初始化工作

Java装载类使用“全盘负责委托机制”。
“全盘负责”是指当一个classLoader加载一个类时,该类所依赖及引用的类也由当前classLoader加载
“委托机制”是指,类加载器加载一个类时先会委托父类寻找目标类,只有在找不到的情况下才会从自己的类路径中查找并装在目标类。这一点是从安全方面考虑的,试想如果一个人写了一个恶意的基础类(如java.lang.String)并加载到JVM将会引起严重的后果,但有了全盘负责制,java.lang.String永远是由根装载器来装载,避免以上情况发生

为什么要使用这种双亲委托模式呢?
1、避免重复加载,父classLoader已经加载了该类时,子classLoader就没有必要再加载一次
2、安全因素。我们试想一下,如果不使用这种委托模式,那我们就可以随时使用自定义的String来动态替代java核心api中定义类型,这样会存在非常大的安全隐患,而双亲委托的方式,就可以避免这种情况,因为String已经在启动时被加载,所以用户自定义类是无法加载一个自定义的ClassLoader。


既然JVM已经提供了默认的类加载器,为什么还要定义自已的类加载器呢?
 
因为Java中提供的默认ClassLoader,只加载指定目录下的jar和class,如果我们想加载其它位置的类或jar时,比如:我要加载网络上的一个class文件,通过动态加载到内存之后,要调用这个类中的方法实现我的业务逻辑。在这样的情况下,默认的ClassLoader就不能满足我们的需求了,所以需要定义自己的ClassLoader。

定义自已的类加载器分为两步: 
1、继承java.lang.ClassLoader
2、重写父类的findClass方法

类加载器与web容器
对于运行在 Java EE容器中的 Web 应用来说,类加载器的实现方式与一般的java应用有所不同,每个web应用都有一个对应的加载器实例。以Tomcat来说,每个应用都对应一个类加载器实例,该加载器实例不同的是它首先尝试加载某个类,如果找不到再代理给父类加载器。这与java应用的加载器顺序是相反的。这个是java servlet规范中推荐的做饭,其目的是使得web应用自己的类的优先级高于web容器提供的类。这种代理模式的一个例外是:Java 核心库的类是不在查找范围之内的。这也是为了保证 Java 核心库的类型安全。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值