在精简JRE过程中,将rt.jar中类通过FileInputStream,FileOutputStream进行拷贝操作出错:
java.lang.ClassFormatError: Extra bytes at the end of class file
源代码:
- byte buf[] = new byte[256];
- while(fin.read(buf) != -1)
- {
- fout.write(buf);
- ir.read();
- }
- fout.flush();
修改后:
- byte buf[] = new byte[256];
- int len = 256;
- while((len = fin.read(buf)) != -1)
- {
- fout.write(buf,0,len);
- ir.read();
- }
- fout.flush();
相关资料:
java.lang.ClassFormatError
thrown when applet runs
Symptoms
When running an applet in a browser using the Sun JVM, a
ClassFormatError
is thrown by theClassLoader
. The same applet runs under the Microsoft VM.
Cause
This error is caused by bytecodes generated from old JDK 1.0.2/1.1 compilers, or from a third-party obfuscator. In the past, many of these compilers and obfuscators generated bytecode that does not conform to the Java VM Specification. Because the verifiers in recent J2SE releases are much stricter about bad class format, the
ClassFormatError
is thrown by the VM when these bad class files are loaded.Some typical problems in some older class files are the following (note that this list is not exhaustive):
- There are extra bytes at the end of the class file.
- The class file contains method or field names that do not begin with a letter.
- The class attempts to access private members of another class.
- The class file has other format errors, including illegal constant pool indices and illegal UTF-8 strings.
- The class file produced by an early (third-party) bytecode obfuscator violates proper class-file format.
Resolution
To allow some of the applets with bad class files to run in the Java 2 platform, Java Plug-in contains a bytecode transformer to transform some of the bad class files to good ones. Currently, only bad class files with the following problems may be transformed:
- Local variable name with a bad constant pool index
- Extra bytes at the end of the class file
- Code segment of the wrong length
- Illegal field/method name
- Illegal field/method modifiers
- Invalid start_pc/length in local var table
Unfortunately, the bytecode transformer cannot transform the following problems, which will still result in a
ClassFormatError
:
- Illegal use of nonvirtual function call
- Arguments can't fit into locals
- Unsorted lookup switch
- Truncated class file
You can resolve these problems by simply recompiling your Java classes with the
javac
compiler from the Java 2 SDK. If you choose to use a third-party obfuscator, be sure to use one that produces class files that respect proper class-file format.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)