侧边栏壁纸
  • 累计撰写 793 篇文章
  • 累计创建 1 个标签
  • 累计收到 1 条评论
标签搜索

目 录CONTENT

文章目录

类加载器

Dettan
2021-04-10 / 0 评论 / 0 点赞 / 169 阅读 / 893 字
温馨提示:
本文最后更新于 2022-07-23,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
tomcat实现了自己的类加载器,只是为了能先加载自己的类再让系统加载器加载.


java 是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全 沙箱分别是:
1.
类加载体系
2.
.class 文件检验器
3.
内置于Java虚拟机(及语言)的安全特性
4.
安全管理器及Java API

四个加载器
BootStrapClassLoader: 启 动 类 加 载 器 , 该ClassLoader 是jvm 在 启 动 时 创 建 的 , 用 于 加 载 $JAVA_HOME$/jre/lib下面的类库(或者通过参数-Xbootclasspath指定)。由于启动类加载器涉及到虚拟机 本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不能直接通过引用进行操作。
ExtClassLoader:扩展类加载器,该ClassLoader是在sun.misc.Launcher里作为一个内部类ExtClassLoader 定义的(即 sun.misc.Launcher$ExtClassLoader),ExtClassLoader会加载 $JAVA_HOME/jre/lib/ext下的类库(或者通过参数-Djava.ext.dirs指定)。
AppClassLoader:应用程序类加载器,该ClassLoader同样是在sun.misc.Launcher 里作为一个内部类 AppClassLoader定义的(即 sun.misc.Launcher$AppClassLoader),AppClassLoader会加载java 环境变量 CLASSPATH 所 指 定 的 路 径 下 的 类 库 , 而 CLASSPATH 所 指 定 的 路 径 可 以 通 过 System.getProperty("java.class.path")获取;当然,该变量也可以覆盖,可以使用参数-cp,例如:java -cp 路 径 (可以指定要执行的class目录)。
CustomClassLoader:自定义类加载器,该ClassLoader是指我们自定义的ClassLoader(java.lang.ClassLoader 的子类),比如tomcat的StandardClassLoader属于这一类;当然,大部分情况下使用AppClassLoader就足够了。

1.
Java的类加载器的种类都有哪些? 1、根类加载器(Bootstrap) --C++写的 ,看不到源码 2、扩展类加载器(Extension) --加载位置 :jre\lib\ext中
3、系统(应用)类加载器(System\App) --加载位置 :classpath中 4、自定义加载器(必须继承ClassLoader)
父亲委托机制(PDM)
从 Java 2(JDK 1.2)开始,类加载过程采取了父亲委托机制(PDM)。PDM 更好的保证了 Java 平台的安全 性,在该机制中,JVM 自带的 Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求 父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。JVM不会向Java 程序提供对 Bootstrap 的引 用。


能不能自己写个类,也叫java.lang.String
可以,但是在用的时候,要用自己的类加载器去加载,否则系统的类加载器永远只是去加载jre.jar包中的String.

由于在Tomcat中都是有webapp自己实现的类加载器先自己加载WEB-INF/classess 目录中的类, 然后才委托上级的类加载器去加载, 如果我们在tomcat的web程序中自己实现一个自己的String, 这时候servlet程序加载的就是我们自己写的String, 但是这样会有许多潜在的问题,比如调用到原先有但是你的String里的类没有的方法就会报java.lang.NoSuchMethodError


0

评论区