自己做电影网站需要的成本,阿里云虚拟主机wordpress建站,做网站需要多大带宽,下载网站软件免费安装文章目录 一、什么是类加载器二、类加载器的应用场景三、类加载器的分类1、分类2、启动类加载器3、Java中的默认类加载器#xff08;1#xff09;扩展类加载器#xff08;2#xff09;应用程序类加载器#xff08;3#xff09;arthas中类加载器相关的功能 四、双亲委派机… 文章目录 一、什么是类加载器二、类加载器的应用场景三、类加载器的分类1、分类2、启动类加载器3、Java中的默认类加载器1扩展类加载器2应用程序类加载器3arthas中类加载器相关的功能 四、双亲委派机制1、介绍2、双亲委派的作用1保证类加载的安全性2避免重复加载 3、Java中如何使用代码方式去主动加载一个类4、类加载器1介绍2arthas中类加载器相关的功能 五、打破双亲委派机制1、打破双亲委派机制的三种方式1自定义类加载器2线程上下文类加载器3Osgi框架的类加载器 六、JDK9之后的类加载器 一、什么是类加载器
类加载器ClassLoader是Java虚拟机提供给应用程序去实现获取类和接口字节码数据的技术。类加载器只参与加载过程总的字节码获取并加载到内存这一部分。
二、类加载器的应用场景 三、类加载器的分类
1、分类
类加载器分为两类一类是Java代码中实现的一类是Java虚拟机底层源码实现的。 类加载器的设计JDK8和8之后的版本差别较大JDK8及之前的版本默认的类加载器有如下几种 类加载器的详细信息可以通过Arthas classloader命令查看classloader - 查看classloader的继承树urls类加载信息使用classloader去getResource。
2、启动类加载器
启动类加载器Boostrap ClassLoader是由HotSpot虚拟机提供的、使用C 编写的类加载器。默认加载Java安装目录/jre/lib下的类文件比如rt.jartool.jarresource.jar等。 通过启动类加载器去加载用户jar包放入jre/lib下进行扩展不推荐尽可能不要去更改JDK安装目录中的内容会出现即使放进去由于文件名不匹配的问题也不会正常被加载。使用参数进行扩展推荐使用-Xbootclasspath/a:jar包目录/jar包名进行扩展。
3、Java中的默认类加载器
扩展类加载器和应用程序类加载器都是JDK中提供的、使用Java编写的类加载器。他们的源码都位于sun.misc.Launcher中是一个静态内部类。继承自URLClassLoader。具备通过目录或者指定jar包将字节码文件加载到内存中。
1扩展类加载器
扩展类加载器Extension Class Loader是JDK中提供的、使用Java编写的类加载器。默认加载Java安装目录/jre/lib/ext下的类文件。
通过扩展类加载器去加载用户jar包
放入/jre/lib/ext下进行扩展不推荐尽可能不要去更改JDK安装目录中的内容。使用参数进行扩展推荐使用**-Djava.ext.dirsjar包目录**进行扩展这种方式会覆盖原始目录可以用;(windows)、:(macos/linux)追加原始目录。
2应用程序类加载器
加载classpath下的类文件。
3arthas中类加载器相关的功能
类加载器的加载路径可以通过classloader -c hash值查看
四、双亲委派机制
1、介绍
由于Java虚拟机中有多个类加载器双亲委派机制的核心是解决一个类到底由谁加载的问题。双亲委派机制指的是当一个类加载器收到加载类的任务时会自底向上查找是否加载过再由顶向下进行加载。向上查找如果已经加载过就直接返回Class对象加载过程结束。这样就能避免一个类重复加载。如果所有的父类加载器都无法加载该类则由当前类加载器自己尝试加载。所以看上去是指顶向下尝试加载。
2、双亲委派的作用
1保证类加载的安全性
通过双亲委派机制避免恶意代码替换JDK中的核心类库比如java.lang.String确保核心类库的完整性和安全性。
2避免重复加载
双亲委派机制可以避免同一个类被多次加载。
3、Java中如何使用代码方式去主动加载一个类
使用Class.forName方法使用当前类的类加载器去加载指定的类。 public static Class? forName(String className)throws ClassNotFoundException {Class? caller Reflection.getCallerClass();return forName0(className, true, ClassLoader.getClassLoader(caller), caller);}private static native Class? forName0(String name, boolean initialize,ClassLoader loader,Class? caller)throws ClassNotFoundException;获取到类加载器通过类加载器的loadClass方法指定某个类加载器加载。
4、类加载器
1介绍
每个Java实现的类加载器中保存了一个成员变量叫“父”类加载器可以理解为他的上级不是继承关系。
应用程序类加载器的parent父类加载器时扩展类加载器而扩展类加载器parent是空但是在逻辑上扩展类加载器依然会把启动类加载器当成父类加载器处理。启动类加载器使用C编写没有父类加载器。 下面体现了启动类加载器、扩展类加载器和应用程序类加载器的层级关系。
2arthas中类加载器相关的功能
类加载器的父子关系可以通过classloader -t查看
五、打破双亲委派机制
1、打破双亲委派机制的三种方式
1自定义类加载器
自定义类加载器并且重写loadClass方法就可以将双亲委派机制的代码去除。Tomcat通过这种方式实现应用之间的类隔离。 Tomact使用了自定义类加载器来实现应用之间类的隔离。每个应用会有一个独立的类加载器加载对应的类。 先来分析ClassLoader的原理ClassLoader中包含了4个核心方法。双亲委派机制的核心代码位于loadClass方法中。 阅读双亲委派机制的核心代码分析如何通过自定义的类加载器打破双亲委派机制。打破双亲委派机制就是将下边的一段代码重新实现。
自定义类加载器默认的父类加载器 以JDK8为例ClassLoader类中提供了构造方法设置parent的内容。 这个构造方法由另外一个构造方法调用其中父类加载器由getSystemClassLoader方法设置该方法返回的是AppClassLoader。
两个自定义类加载器加载相同限定名类不会冲突
在同一个Java虚拟机中只有相同了加载器相同的类限定名才会被认为是同一个类。在Arthas中使用sc -d 类名的方式查看具体的情况。
2线程上下文类加载器
利用上下文类加载器加载类比如JDBC和JNDI。
3Osgi框架的类加载器
历史上Osgi框架实现了一套新的类加载机制允许同级之间委托进行类的加载。
六、JDK9之后的类加载器
由于JDK9引入了module的概念类加载器在设计上发生了很多的变化。 启动类加载器使用Java编写位于jdk.internal.loader.ClassLoaders类中。java中的BootClassLoader继承自BuiltinClassLoader实现从某块中找到要加载的字节码资源文件。启动类加载器依然无法通过java代码获取到返回的仍然是null保持了统一。 扩展类加载器被替换成了平台类加载器Platform Class Loader。平台类加载器遵循模块化方式加载字节码文件所以继承关系从URLClassLoader变成了BuiltinClasLoaderBuiltinClasLoader实现了从模块中加载字节码文件。平台类加载器的存在更多的是为了与老版本的设计方案兼容自身没有特殊的逻辑。