大家好,又见面了,我是你们的朋友全栈君。
1.什么情况下需要自定义类加载器?
(1)隔离加载类:在某些框架内进行中间件与应用的模块隔离,把类加载到不同的环境。比如,某容器框架通过自定义类加载器确保应用中依赖的jar包不会影响到中间件运行时使用的jar包。(jar包之间的冲突的消除)
(2)修改类加载方式:类的加载模型并非强制,除Bootstrap外,其它的加载并非一定要引入,或者根据实际情况在某个时间点进行按需动态加载。
(3)扩展加载源:比如从数据库、网络,甚至是电视机机顶盒进行加载。
(4)防止源码泄露。java代码容易被编译和篡改,可以进行编译加密。那么类加载器也需要自定义,还原加密的字节码。
一个简单的类加载器实现的示例:
步骤:继承ClassLoader,重写findClass()方法,调用defineClass()方法。
代码语言:javascript复制public class CustomClassLoader extends ClassLoader {
protected Class<?> findClass(String name) throws ClassNotFoundException {
try {
byte[] result = getClassFromCustomPath(name);
if(result == null) {
throw new FileNotFoundException();
} else {
return defineClass(name, result, 0, result.length );
}
} catch(Exception e) {
e.printStackTrace();
}
throw new ClassNotFoundException(name);
}
private byte[] getClassFromCustomPath(String name) {
// 从自定义路径中加载指定类
return null;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
CustomClassLoader customClassLoader = new CustomClassLoader();
System.out.println(customClassLoader);
try {
Class<?> clazz = Class.forName("One", true, customClassLoader);
Object obj = clazz.newInstance();
System.out.println(obj.getClass().getClassLoader());
} catch(Exception e) {
e.printStackTrace();
}
}
}
理论执行结果:classloader.CustomClassLoader@5e481248
由于中间件一般都有自己的依赖jar包,在同一个工程内引用多个框架时,往往被迫进行类的仲裁。安某种规则jar包的版本被统一指定,导致某些存在包路径、类名相同的情况,就会引起类冲突,导致应用程序出现异常。主流的容器类框架都会自定义加载器,实现不同的中间件之间的类隔离,有效避免了冲突。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。