携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第39天,点击查看活动详情
拓展:双亲委派机制与AOP面向切面编程原理
JVM最底层的载入是BootstrapClassLoader,为C语言编写,从Java中引用不到,其上是ExtClassLoader,然后是AppClassLoader,普通类中getContextClassLoader()得到的是AppClassLoader,getContextClassLoader().getParent()得到的是ExtClassLoader,而再往上getParent()为null,即引用不到BootstrapLoader。
启动类加载器:BootstrapClassLoader,负责加载存放在JDK\jre\lib(JDK代表JDK的安装目录,下同)下,或被-Xbootclasspath参数指定的路径中的,并且能被虚拟机识别的类库(如rt.jar,所有的java.*开头的类均被BootstrapClassLoader加载)。启动类加载器是无法被Java程序直接引用的。
扩展类加载器:ExtensionClassLoader,该加载器由sun.misc.Launcher$ExtClassLoader实现,它负责加载DK\jre\lib\ext目录中,或者由java.ext.dirs系统变量指定的路径中的所有类库(如javax.*开头的类),开发者可以直接使用扩展类加载器。
应用程序类加载器:ApplicationClassLoader,该类加载器由sun.misc.Launcher$AppClassLoader来实现,它负责加载用户类路径(ClassPath)所指定的类,开发者可以直接使用该类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。
应用程序都是由这三种类加载器互相配合进行加载的,如果有必要,我们还可以加入自定义的类加载器。因为JVM自带的ClassLoader只是懂得从本地文件系统加载标准的java class文件,因此如果编写了自己的ClassLoader,便可以做到如下几点: 1)在执行非置信代码之前,自动验证数字签名。 2)动态地创建符合用户特定需要的定制化构建类。 3)从特定的场所取得java class,例如数据库中和网络中。
双亲委派机制 简单来说既是先拿父类加载器加载class,父类加载失败后再使用本类加载器加载。当AppClassLoader加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器ExtClassLoader去完成。当ExtClassLoader加载一个class时,它首先也不会自己去尝试加载这个类,而是把类加载请求委派给BootStrapClassLoader去完成。如果BootStrapClassLoader加载失败(例如在$JAVA_HOME/jre/lib里未查找到该class),会使用ExtClassLoader来尝试加载;若ExtClassLoader也加载失败,则会使用AppClassLoader来加载,如果AppClassLoader也加载失败,则会报出异常ClassNotFoundException。
其它相关点 1.全盘负责,当一个类加载器负责加载某个Class时,该Class所依赖的和引用的其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入。 2.父类委托,先让父类加载器试图加载该类,只有在父类加载器无法加载该类时,才使用本类加载器从自己的类路径中加载该类。 3.缓存机制,缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区寻找该Class,只有缓存区不存在,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存入缓存区。这就是为什么修改了Class后,必须重启JVM,程序的修改才会生效。
--
AOP面向切面编程 AOP 专门用于处理系统中分布于各个模块(不同方法)中的交叉关注点的问题,在 Java EE 应用中,常常通过AOP来处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等,在不改变已有代码的情况下,静态/动态的插入代码。
将AOP放到这里的主要原因是因为AOP改变的class文件,达到嵌入方法的目的,静态模式使用AspectJ进行由.java到.class文件编译。而动态模式时使用CGLIB载入使用javac编译的.class文件后,使用动态代理的方式,将要执行的方法嵌入到原有class方法中,完成在内存中对class对象的构造,这也就是所谓动态代理技术的内在原理。同时静态方式在载入前已经修好完.class文件,而动态方式在.class载入时需要做额外的处理,导致性能受到一定影响,但其优势是无须使用额外的编译器。总体的技术的切入点在于在修改机器执行码,达到增加执行方法的目的。