JVM---自定义类加载器
1. 为什么需要自定义类加载器
应用场景介绍:加密防止被反编译,不用JAVA的类加载器。非标准的来源加载代码:字节码放在数据库,云端,自定义类加载器,指定来源的加载器。
2. 双亲委派模型:
当前类加载器已经加载的类中查询是否此类已经被加载,如果没有找到就去委托父类加载器去加载,启动类加载器加载失败,就使用拓展类加载器尝试加载。
好处:避免用户自己编写类替换核心类,避免了类的重复加载
3. 自定义类加载器
继承ClassLoader 实现findClass方法。
Java类加载器机制总结
1. 类加载器的组织结构,类加载器具有层次结构,即父子关系
2. 分类:
启动类,加载虚拟机的核心类库。Bootstrapclass loader.
标准扩展类加载器,加载除了基本API之外的一些拓展类。Extensionclass loader.
自定义类加载器,加载应用程序和程序员自定义类。AppClassLoader.
3. 类的加载机制,类被加载到虚拟机内存包括加载,链接,初始化,链接又细分为验证,准备,解析。
3.1 加载可以使用系统提供的类加载器完成,也可以由用户自定义的类加载器完成,开发人员可以通过类加载器控制字节流。
3.2 链接阶段,验证,准备,解析。对于类变量,类方法指的是方法区的指针,然后对于实例化方法 ,实例对象来说就是偏移量。
3.3 初始化,使用new关键字实例化对象,访问一个类的静态字段,静态方法。对类进行反射调用的时候,对初始化子类,如父类还没有进行过初始化,则进行父类的初始化。
4. 类加载的三种方式
由new关键字创建的一个类实例,调用Class.forName()方法,通过反射加载类,调用某个ClassLoader实例的loadclass()方法。