如何自定义类加载器_网易js加载器下载地址

2022-10-04 10:55:11 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

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包的版本被统一指定,导致某些存在包路径、类名相同的情况,就会引起类冲突,导致应用程序出现异常。主流的容器类框架都会自定义加载器,实现不同的中间件之间的类隔离,有效避免了冲突。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

0 人点赞