类加载器的两种

类加载器的分类
JVM支持两种类型的类加载器,分别为引导类加载器(BootstrapClassLoader)和自定义类加载器(User-Defined ClassLoader)

从概念上来讲, 自定义类加载器一般指的是程序中由开发人员自定义的一类,类加载器,但是Java虚拟机规范却没有这么定义,而是将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器

所以具体为引导类加载器(BootstrapClassLoader)和自定义类加载器(包括ExtensionClassLoader、Application ClassLoader、User Defined ClassLoader)

Application ClassLoader也叫System ClassLoader

可以看出ExtensionClassLoader、APPClassLoader都间接继承了ClassLoader。

四类加载器之间的关系可以看做是阶级关系,分为上下级,并不是子父类的继承关系。

Boot strapClassLoader由C/C++实现的,其他三类加载器是由Java实现的

虚拟机自带的加载器
启动类加载器(引导类加载器 BootStrap ClassLoader)
这个类加载使用C/C++语言实现的,嵌套在JVM内部。

它用来加载Java的核心库(JAVA HOME/jre/lib/rt.jar.resources.jar或sun.boot.class. path路径下的内容) ,用于提供JVM自身需要的类

并不继承自java.lang.ClassLoader,没有父加载器。

加载扩展类和应用程序类加载器,并指定为他们的父类加载器。

出于安全考虑, Bootstrap启动类加载器只加载包名为java, javax.sun等开头的类

扩展类加载器(Extension ClassLoader)
Java语言编写,由sun.misc. Launcher$ExtclassLoader实现

派生于ClassLoader类

父类加载器为启动类加载器

从java.ext.dirs系统属性所指定的目录中加载类库,或从JDK的安装目录的jre/lib/ext子目录(扩展目录)下加载类库。如果用户创建的JAR放在此目录下,也会自动由扩展类加载器加载。

应用类加载器(系统类加载器 AppClassLoader)
java语言编写,由sun.misc.Launcher$AppClassLoader实现

派生于classLoader类

父类加载器为扩展类加载器

它负责加载环境变量classpath或系统属性java.class.path指定路径下的类库

该类加载是程序中默认的类加载器,一般来说, Java应用的类都是由它来完成加载

通过ClassLoader#getSystemClassLoader()方法可以获取到该类加载器

用户自定义类加载器实现步骤:
1,开发人员可以通过继承抽象类java . lang.ClassLoader类的方式,实现自己的类加载器,以满足一些特殊的需求

2,在JDK1.2之前,在自定义类加载器时,总会去继承ClassLoader类并重写loadClass ()方法,从而实现自定义的类加载类,但是在JDK1.2之后已不再建议用户去覆盖loadClass ()方法,而是建议把自定义的类加载逻辑写在findClass ()方法中

3·在编写自定义类加载器时,如果没有太过于复杂的需求,可以直接继承URLCIassLoader类,这样就可以避免自己去编写findclass ()方法及其获取字节码流的方式,使自定义类加载器编写更加简洁。

一、代理
代理与反射总结
代理分为静态代理和动态代理。静态代理在运行前已经存在,代理类和委托类的关系在运行前就已经确定了。而动态代理则在运行时确定的,根据反射机制生成的,代理类和委托类的关系在运行时才能确定。

2、动态代理
在实现时并不需要指定代理哪个对象,在需在运行时指定实现即可,它的优点是更加灵活和方便。

二、反射
反射机制这样的一种功能,对于类来说,它是在运行过程中可以知道任意一个类的所有属性和方法;对于对象来说,可以调用它的任意一个属性和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值