gpt4 book ai didi

java - 使用 JarInputStream 读取方法读取字节调用 defineClass 时出现 ClassFormatError

转载 作者:行者123 更新时间:2023-11-29 03:49:09 29 4
gpt4 key购买 nike

我正在使用以下方法从 jar 条目(仅包含类文件)中读取字节。 jar里面没有jar文件。

private List<byte[]> readFromJarFile(File cp) 
{
List<byte[]> cbytes = new ArrayList<byte[]>();
try
{
java.util.jar.JarInputStream jin = new java.util.jar.JarInputStream(new java.io.FileInputStream(cp));
java.util.jar.JarEntry je = jin.getNextJarEntry();
while (je != null)
{
if (!je.isDirectory() && je.toString().endsWith(".class"))
{
//assume class file size < Integer.MAX_VALUE
System.out.printf("readFromJarFile: jar entry name %s ...%n",je.toString());
byte[] cbyte = new byte[(int) je.getSize()];
jin.read(cbyte,0,(int) je.getSize());
cbytes.add(cbyte);
}
je = jin.getNextJarEntry();
}
}
catch (java.io.IOException ie)
{
ie.printStackTrace();
}

return cbytes;
}

现在,当我使用从上述方法返回的字节数组调用 defineClass 时,会抛出异常。

java.lang.ClassFormatError: Unknown constant tag 0 in class file <Unknown>
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.lang.ClassLoader.defineClass(ClassLoader.java:465)
at san.tool.JPAEntityProcessor$JPAClassLoader.loadClass(JPAEntityProcessor.java:34)
at san.tool.JPAEntityProcessor.processJPAEntities(JPAEntityProcessor.java:49)
at san.tool.JPAEntityProcessorTest.testWithJarFile(JPAEntityProcessorTest.java:40)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at

我搜索了本网站和互联网上的所有其他论坛,但找不到答案。我期待着来自这里的成员的一些见解。

感谢和问候桑塔努

最佳答案

jin.read(cbyte,0,(int) je.getSize());

不能保证read 方法会将je.getSize() 字节读入缓冲区。相反,它返回实际读取的字节数。您需要将读取尝试包装到循环中并读取直到缓冲区已满。

是这样的:

int len = (int) je.getSize();
int offset = 0;
int read;
while ((read = jin.read(cbyte, offset, len - offset)) > 0) {
offset += read;
}

UPD 一年后我意识到,我的原始示例在阅读整个流后会卡住。而后来的“固定”版本实际上不会进入循环。因此,这里是简短、正确且经过测试的版本。

关于java - 使用 JarInputStream 读取方法读取字节调用 defineClass 时出现 ClassFormatError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9547631/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com