自定义类加载器加载指定压缩包中的类

来源:互联网 发布:电商美工工作计划 编辑:程序博客网 时间:2024/06/06 03:36

最近做项目需要自己写类加载器加载指定压缩包中的类(jar包),基本思路是得到指定的压缩包并通过java.util.jar包中的类访问其中的资源,找到指定的类名所对应的.class文件,得到其输入流,通过其输入流读取其中的字节并以字节数组的形式返回,通过ClassLoader中的方法加载此字节数组所代表的类.初始想法的代码如下(暂不考虑异常情况):

运行上述代码加载类发现随着类的不同有时成功有时报错,虽然错误描述不一样,但都是java.lang.ClassFormatError,总是出现这种情况,弄的我头都大了,上网找资料,开始以为是JDK的版本问题,于是把Eclipse的版本全部都调为一致的1.5版,后来自己用文本编辑器写代码,用最原始的方法编译并执行代码,发现从本地文件中读取.class字节码文件没有问题,一旦将文件打包再从包中读取就会出现同样的错误提示.后无意中发现当输入流的read(byte[],int,int)方法并不是一次性的读取指定长度的字节流,而是不确定的,尤其是在压缩文件中读取,经测试,我的压缩包中的字节码文件超过900字节就会报错,小于就没问题,所以应该是输入流的读取出现问题,遂调整思路如下:先得到字节码文件的总长度,一般情况下InputStream.available()方法和ZipEntry.getSize()方法都可得到,可以的话建议使用后者.通过得到的长度构造一个存放完整文件的字节数组,然后声明一个缓冲数组用来每次读取输入流中的数据,得到读取的长度并将读到的字节拷贝到前者数组中,最后通过完整文件的数组加载字节码文件,做此工作只需将第一个类的部分代码修改如下:

此时我的代码可以正确的加载类了.

原创粉丝点击