关于JAVA含有内部类的类编译成class后修改Class文件出现错误

问题描述

JAVA类编译后是class文件,编译后生成了getname.class,和getname$1.class.这里我没有源码,我修改了getname.class中的一个System.out.print中输出的内容,比如原来输出wang,我使用工具将输出内容改成了li,文件反编译后与原来没有修改时的内容一致,但是在TOMCAT启动的时候报错了,报错内容为java.lang.ClassFormatError: Wrong InnerClasses attribute length in class file. 这里应该如何处理才不会出错,或者InnerClasses attribute length在class中何处修改,使用什么工具可以修改。

解决方案

针对字节码的修改(Class)需要对Class的文件结构有一定的了解,其中有这样一条会和题主遇到的问题相关:就是常量池(constant pool):.常量池是写在Class文件头的.方法名、类名、普通常量(简单点就是所有的字符串)都会存在常量池的,引用的地方引用的是常量池中的偏移;.题主只修改了引用的地方引发了常量池的变更,可能是与内部类的的原始引用位置发生了偏移导致的。方法有三:1)将两个类都反编译成代码后一起编译成Class文件后使用;2)使用ASM等工具直接修改字节码(需要对Class文件格式有一定的了解);3)考虑使用继承等手段而不是修改原始代码。
解决方案二:
你修改后保存,会同时生成两个文件,这2个文件要同时替换才可以
解决方案三:
http://blog.csdn.net/hexin373/article/details/6669813

时间: 2025-01-25 02:03:40

关于JAVA含有内部类的类编译成class后修改Class文件出现错误的相关文章

举例讲解Java的内部类与类的加载器_java

内部类 class A { //Inner1 要在 A 初始化后 才能使用,即要被A的对象所调用 class Inner1 { int k = 0; // static int j = 0; //A加载后,Inner1没有加载,所以这个 静态变量j 无法立即使用,报错 final int z = 0; /*static void say1() { }*/ void say2() { } } //Inner2 在A加载好后就可以使用了 static class Inner2 { int k = 0

Java:使用内部类实现类的多重继承

Java不支持类的多重继承,但可以使用内部类来继承实现更多的类. 下面的例子,目标类需要继承两个抽象类(A和B).目标类C本身继承类A,并使用一个匿名内部类继承另一个类B. MultiImplementation.java abstract class A { abstract void methodA(); } abstract class B { abstract void methodB(); } class C extends A { @Override void methodA() {

JSP编译成Servlet(四)JSP与Java行关系映射

我们知道java虚拟机只认识class文件,要在虚拟机上运行就必须要遵守class文件格式,所以JSP编译成servlet后还需要进一步编译成class文件,但从JSP文件到java文件再到class文件的过程需要考虑的事情比较多,其中一个比较重要的就是调试问题,由于语法不一样,jsp某行执行的逻辑怎样与java文件对应起来,这样在JVM执行过程发生异常或错误才能找到JSP对应的行,提供一个友好的调试信息.类似的,jsp文件名编译后的java文件名同样也要有映射关系.     总的来说,为了解决

java-Java编译成.exe的目的是什么,具体怎么做?

问题描述 Java编译成.exe的目的是什么,具体怎么做? 急求:Java编译成.exe的目的是什么,具体步骤怎么做?谢谢各位啦 解决方案 JDK只能将java源文件编译为class文件.class文件是一种跨平台的字节码,必须依赖平台相关的JRE来运行.Java以此来实现跨平台.有些开发工具可以将java文件编译为exe文件. 但是这种做法,因为取消了跨平台性.如果你确信你的软件只在Windows平台上运行,你可以考虑使用C++/C#来编程.具体做法可以参考: http://jingyan.b

求助:调用包含并行计算的m文件编译成的动态链接库

问题描述 求助:调用包含并行计算的m文件编译成的动态链接库 请问如何在c++环境下调用包含并行计算(parfor)的MATLAB编译好的动态链接库(C++ shared library)?当m文件中不包含matlabpool open时,动态链接库是可以成功调用的,但是一旦m文件中包含matlabpool open,调用时会出现错误: "XXX exited with code -529697949" 求大神帮忙,如何调用含有并行计算的MATLAB动态链接库? 我的环境是:win7,Q

把aspx文件编译成DLL文件

编译 前言 Asp.net不是asp的简单升级,而是微软.Net计划中的一个重要组成部分,它依托.Net的多语言与强大的类库支持,引进了服务端HTML控件与WEB控件,自动处理控件的客户端与服务端的 交互,为开发人员提供了类似Windows下窗口编程的界面,为开发大型网络应用程序功能提供了良好的编程接口,也能够极大地提高开发人员的工作效率. 然而,"一次转换,两次编译"过程使得aspx文件在首次执行(或更新后首次运行)时显得略有不足,特别是在拥有大量aspx及codebehind的代码

Flex开发中使用Ant编译.mxml成.swf后,在.swf里使用Session的解决方法

Flex开发中使用Ant编译.mxml成.swf后,在.swf里使用Session的解决方法 http://iamin.blogdriver.com/iamin/1176113.html Flex Remote Object中直接使用HttpSession的方法在Flex Samples里有Session的操作使用例子:http://localhost:8080/samples/explorer/misc/ServerSessionDemo.mxml但是,使用mxmlc编译.mxml成.swf后

java代码-关于poi类java读取Excel文件出现ioexception异常Invalid header signature

问题描述 关于poi类java读取Excel文件出现ioexception异常Invalid header signature 读取是因为头部文件无法识别,我按一般方法是另存为就可以了,有没别的方法是通过代码实现的,我写的功能是通过jsp来上传excel到临时文件,在用poi类来读取,所以打开excel另存为的方法不适合我,求救,很急 解决方案 用poi处理excel文件异常:java.io.IOException: Invalid header signature; read 23380427

使用Axis2和JiBX将Java类转换成Web服务,第2部分

使用Axis2和JiBX将Java类转换成Web服务,第2部分: 把XML转换成功能全面的Web服务 本文配套源码 简介 Apache Axis2 提供了好几种 XML 解决方案,可以轻松的开发功能强大的 Web 服务.Axis2 是实现 Web 服务的一个非常不错的选择.由于 Apache Axis2 和 Apache Geronimo duo 是免费而且开放源码的,因此可以考虑使用这两者. 在本系列的前一部分中,我向您介绍了在本系列两篇文章中使用到的 Java 类.我们通过 WSDL 将这些