1

使用している JAR ファイルがあり、その中のファイルの 1 つを変更したいと考えています。一言で言えば、私が持っている

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 から新しいクラスを継承させ、継承された 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

必要性を感じたことがないので、ポインタを提供することしかできません。

あなたが言及しているのは「バイトコード拡張」と呼ばれ、はい、それを達成するためのフレームワークがいくつかあります。

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

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

通常、Java 開発者はコントロール パターンの反転を使用することを好みます。これにより、コードは構成ファイルを介して実行時にそれ自体を構成できます。詳細については、Spring IoC を参照してください。

于 2012-07-30T20:04:01.150 に答える
2

実現不可能なオプションの 1 つClassA、新しいバージョンの を作成し、それを独自の jar ファイルにパッケージ化し、それをクラスパスの元のバージョンよりも前に配置することです。

ただし、これは非常に奇妙なシナリオです。既存の jar ファイルを更新できないのはなぜでしょうか。多少の余分な作業が必要になるとしても、長い目で見れば、他のどのアプローチよりもはるかにクリーンになる可能性があります。

于 2012-07-30T20:00:10.543 に答える