修改JAR文件而不重建JAR

时间:2012-07-30 19:55:30

标签: java inheritance jar override

我有一个我正在使用的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,这是一个噩梦,试图正确地对所有这些进行处理,然后所有这些都需要对它们进行相同的处理。我知道你不能超载/覆盖整个课程,这基本上就是我想做的事情。还有另一种方法吗?

修改 为了使它更难,我无法下载任何新的框架或软件或任何东西。

2 个答案:

答案 0 :(得分:3)

我只能提供指针,因为我从未觉得需要它。

您所指的是“字节码增强”,是的,有几个框架可以实现它。

BCEL - http://commons.apache.org/bcel/

ASM - http://asm.ow2.org/

通常,java开发人员更喜欢使用控制模式的反转。这允许代码在运行时通过配置文件进行自我配置 - 有关详细信息,请参阅Spring IoC。

答案 1 :(得分:2)

可能不可行的一个选项是创建ClassA的新版本,将其打包在自己的jar文件中,并将其置于原始版本之前类路径。

然而,这是一个非常奇怪的场景 - 为什么你不能更新现有的jar文件?即使这意味着一些额外的工作,从长远来看,它可能比任何其他方法更清洁