我有一个正在使用的JAR文件,我想修改其中的一个文件。总之,我有
public class ClassB {
public void printMethod(){
ClassA A = new ClassA();
A.printout();
}
}
public class ClassA {
public void printout(){
System.out.println("1234");
}
}我想把A类的打印输出方法改为
public class ClassA {
public void printout(){
System.out.println("abcd");
}
}我知道,如果不解压缩/重建一个JAR,就不能修改它,因此,假设我不能这样做。是否有一种方法可以对ClassA进行修改而不实际触及当前的ClassA?我的方法是使用重写的方法从ClassA继承一个新类,然后从调用继承ClassA的ClassB继承一个新类。
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,因此试图正确地对所有这些类执行此操作是一场噩梦,而所有这些类都需要对它们执行相同的过程。我知道你不能重载/覆盖整个类,这基本上是我想要做的。还有别的办法吗?
编辑使它更加困难,我不能下载任何新的框架或软件或任何东西。
发布于 2012-07-30 20:00:10
一个可能不可行的选项是创建一个新版本的ClassA,将其打包到自己的jar文件中,并将其放在类路径中的原始版本之前。
但是,这是一个非常奇怪的场景--为什么不能更新现有的jar文件?即使这意味着要做一些额外的工作,但从长远来看,它可能比任何其他方法都要干净得多。
发布于 2012-07-30 20:04:01
我只能提供指点,因为我从来没有感觉到它的必要性。
您所指的是所谓的“字节码增强”,当然有几个框架可以实现它。
BCEL - http://commons.apache.org/bcel/
ASM - http://asm.ow2.org/
通常,java开发人员更喜欢使用控制模式的反转。这允许代码在运行时通过配置文件配置自己--有关更多细节,请参见Spring。
https://stackoverflow.com/questions/11728647
复制相似问题