1

我有一个正在使用的 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 继承一个新类,然后从调用 Inherited 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,以至于试图对所有类正确执行此操作是一场噩梦,然后所有这些类都需要对它们进行相同的处理。我知道你不能重载/覆盖整个类,这基本上是我想做的。还有另一种方法可以做到这一点吗?

编辑 更难,我不能下载任何新的框架或软件或任何东西。

4

2 回答 2

3

I can only provide pointers as I never felt the need for it.

What you are referring to is called "Bytecode enhancement", and yes there are several frameworks to achieve it.

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

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

Usually, java developers prefer to use the inversion of control pattern. This allows the code to configure itself at runtime via a configuration file - See Spring IoC for more details.

于 2012-07-30T20:04:01.150 回答
2

一种可能不可行的选择是创建一个新版本ClassA,将其打包到自己的 jar 文件中,然后将其放在类路径中的原始版本之前。

However, this is a pretty odd scenario - why can you not update the existing jar file? Even if that means a bit of extra work, it's likely to be much cleaner in the long run than any other approach.

于 2012-07-30T20:00:10.543 回答