java代码在编译后会变成java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终要转化为汇编指令在CPU上执行
类装载器ClassLoader
类加载概念:通过一个类的全限定名来获取描述此类的二进制字节流,每一个类加载器都有一个独立的类名称空间,比较2个类是否相等,只有在这2个类是由同一个类加载器加载的前提下才有意义。
ClassLoader是一个抽象类
ClassLoader的实例将读入Java字节码.class将类装载到JVM中
ClassLoader可以定制,满足不同的字节码流获取方式
ClassLoader负责类装载过程中的加载阶段,只负责类读进
类加载器细分:
bootstrap ClassLoader启动类加载器
Extension ClassLoader扩展类加载器
Application ClassLoader应用程序类加载器
Custom ClassLoader(自定义ClassLoader)
每个ClassLoader都有一个Parent作为父亲
双亲委派模型存在问题:因为自底向上 询问 自顶向下 加载
好处:兼容性:保证一个类在程序的各种类加载器环境中都是统一个类
安全性:保证加载的类都是官方的类,不会加载到蓄意破坏的类
ClassLoader的重要方法:
public Class<?> loadClass(String name) throws ClassNotFoundException
载入并返回一个Class
protected final Class<?> defineClass(byte[] b, int off, int len)
定义一个类,不公开调用
protected Class<?> findClass(String name) throws ClassNotFoundException
loadClass回调该方法,自定义ClassLoader的推荐做法
protected final Class<?> findLoadedClass(String name)
寻找已经加载的类
(如果要自定义一个classLoader,就需要重写或者调用这些方法)