0

私は少し苦境にあり、それを解決する方法についていくつかの助けを探しています。idlsから作成されたjarファイルからさまざまなクラスをインポートするソースコードがあります。これで、このidl jarの新しいバージョンが提供されました。これは、古いimportステートメントをすべて壊す異なるパッケージ構造を持っています。importステートメントを変更できないので、これを回避する方法があるかどうかを確認しようとしています。何か案は?

基本的に、できればコードを変更せずに、現在のソースコードを新しいバージョンと古いバージョンの両方のjarで機能させるように求められています。私はそれが可能だとは思いませんが、私は間違っていることを望んでいます。

4

3 に答える 3

1

これができることの1つです。古いクラスをすべて再作成し、新しいクラスと一致させることです。たとえば、があった場合、a.Foo現在はb.foo、次のようになります。

package a;
public class Foo {
    b.Foo foo;
    public void method() {
        foo.method();
    }
}

package b;
public class Foo {
    public void method() {
        // Your new code...
    }
}

これは少し面倒ですが、下位互換性を確保するために支払う代償だと思います。

別の解決策は、クラス構造で許可されている場合、a.Foo継承することb.fooになるため、すべてのデリゲートメソッドを作成する必要はありません。ただし、プロジェクトによっては機能しない場合があります。

お役に立てれば。

于 2012-01-31T18:40:31.913 に答える
1

いいえ、それを行う方法はありません。ただし、パッケージ名を一括で変更する場合は、Linuxのコマンドsedを使用できます。

たとえば、古いパッケージがcom.patitoで、それをorg.duckに変更したい場合は、次のようにすることができます。

 sed 's/com.patito/org.duck/g' *.java
于 2012-01-31T18:44:07.937 に答える
0

それはすべて、構造の変化がどれほどひどいかに依存します。新しいクラス(異なる機能)が古いクラスを置き換えたが、同じ名前を維持している場合、あなたはかなり乾杯しています。新しいクラスに単に新しい名前/パッケージがある場合は、すべての元のインポートのラッパーを作成できます。

たとえば、元のクラスが次の場合:

package my.package;
public class OldClassName{
  public void getSomeData(){}
}

しかし、現在は次のように変更されています。

package my.new.package;
public class NewClassName{
  public void getSomeData(){}
}

元のクラスのラッパーを作成できます。

package my.package;
import my.new.package;
public class OldClassName extends NewClassName{
}

警告:

  1. あなたがたくさんのクラスを持っているなら、これは王室の痛みです
  2. 最終的ではないクラスに制限されます。元のインポートが最終クラスである場合、あなたは乾杯します。あなたができる最善のことは、構成(さらに多くの作業を意味します)と多くの委任です。

クラスがたくさんある場合は、ラッパーを生成するための小さなユーティリティをいつでも自分で作成できます...

完了すると、新しいラッパーjarを新しいlibと一緒にドロップできるようになり、動作するはずです。

于 2012-01-31T19:40:34.347 に答える