我有一个我正在使用的JAR文件,我想修改其中的一个文件。简而言之,我有
public class ClassB {
public void printMethod(){
ClassA A = new ClassA();
A.printout();
}
}
public class ClassA {
public void printout(){
System.out.println("1234");
}
}
我希望将ClassA的打印输出方法更改为
public class ClassA {
public void printout(){
System.out.println("abcd");
}
}
我知道你不能在没有拆包/重建它的情况下修改JAR,为此,让我说我做不到。有没有办法在不实际接触当前ClassA的情况下对ClassA进行修改?我的方法是使用重写方法从ClassA继承一个新类,然后从ClassB继承一个新类,调用Inherited ClassA
public class InheritedClassA extends ClassA{
@Override
public void printout(){
System.out.println("abcd");
}
}
public class InheritedClassB extends ClassB{
@Override
public void printMethod(){
InheritedClassA A = new InheritedClassA();
A.printout();
}
}
我不喜欢这种方法,因为在我的实际JAR中,很多类都在使用ClassA,这是一个噩梦,试图正确地对所有这些进行处理,然后所有这些都需要对它们进行相同的处理。我知道你不能超载/覆盖整个课程,这基本上就是我想做的事情。还有另一种方法吗?
修改 为了使它更难,我无法下载任何新的框架或软件或任何东西。
答案 0 :(得分:3)
我只能提供指针,因为我从未觉得需要它。
您所指的是“字节码增强”,是的,有几个框架可以实现它。
BCEL - http://commons.apache.org/bcel/
ASM - http://asm.ow2.org/
通常,java开发人员更喜欢使用控制模式的反转。这允许代码在运行时通过配置文件进行自我配置 - 有关详细信息,请参阅Spring IoC。
答案 1 :(得分:2)
可能不可行的一个选项是创建ClassA
的新版本,将其打包在自己的jar文件中,并将其置于原始版本之前类路径。
然而,这是一个非常奇怪的场景 - 为什么你不能更新现有的jar文件?即使这意味着一些额外的工作,从长远来看,它可能比任何其他方法更清洁
。