JVM-自定义类加载器

为什么要自定义类加载器?

1、隔离加载类
在某些框架内进行中间件与应用的模块隔离,把类加载到不同的环境。比如:阿里内某容器框架通过自定义类加载器确保应用中依赖的jar包不会影响到中间件运行时使用的jar包。再比如:Tomcat这类Web应用服务器,内部自定义了好几种类加载器,用于隔离同一个Web应用服务器上的不同应用程序。(类的仲裁-->类冲突)
2、修改类加载的方式
类的加载模型并非强制,除Bootstrap外,其他的加载并非一定要引入,或者根据实际情况在某个时间点进行按需进行动态加载
3、扩展加载源
比如从数据库、网络、甚至是电视机机顶盒进行加载
4、防止源码泄漏
Java代码容易被编译和算改,可以进行编译加密。那么类加载也需要自定义,还原加密的字节码。


常见的应用场景
实现类似进程内隔离,类加载器实际上用作不同的命名空间,以提供类似容器、模块化的效果
例如,两个模块依赖于某个类库的不同版本,如果分别被不同的容器加载,就可以互不干扰
这个方面的集大成者是JavaEE和OSGI、JPMS等框架。
应用需要从不同的数据源获取类定义信息,例如网络数据源,而不是本地文件系统。或者是需
要自己操纵字节码,动态修改或者生成类型。
注意:
在一般情况下,使用不同的类加载器去加载不同的功能模块,会提高应用程序的安全性。但是如果涉及Java类型转换,则加载器反而容易产生不美好的事情。在做]ava类型转换时,只有两个类型都是由同一个加载器所加载,才能进行类型转换,否则转换时会发生异常

两种实现方式
用户通过定制自己的类加载器,这样可以重新定义类的加载规则,以便实现一些自定义的处理逻辑。
实现方式
  Java提供了抽象类java.lang.ClassLoader,所有用户自定义的类加载器都应该继承ClassLoader类。
  在自定义ClassLoader的子类时候,我们常见的会有两种做法
方式一;重写loadclass()方法
方式二:重写findclass()方法-->推荐

 

猜你喜欢

转载自blog.csdn.net/qq_39940205/article/details/121460434