0

現在のJavaプロジェクトでは、いくつかのJavaファイルをパッケージ「fr.inria.arles.pankesh.gen」からパッケージ「fr.inria.arles.pankesh.impl」にコピーするJavaプログラムを作成しました。

パッケージ「fr.inria.arles.pankesh.gen」からパッケージ「fr.inria.arles.pankesh.impl」にJavaファイルをコピーした後、Javaファイルのパッケージ情報の変更により、Javaファイルでエラーが発生します。

私の質問は、「プログラムがJavaファイルをパッケージ「fr.inria.arles.pankesh.gen」からパッケージ「fr.inria.arles」にコピーするときに、ヘッダーのパッケージ情報を(手動ではなく、Javaコードを介して)変更する方法はありますか? .pankesh.impl」。

4

2 に答える 2

3

Javaソースファイルをコピーする場合は、次のことを行う必要があります。

  1. ソースファイルを開きます。
  2. 宛先ファイルを開きます。
  3. packageキーワードが表示されるまで、ソースから宛先にすべてをコピーします。
  4. packageキーワードを宛先ファイルにコピーします。
  5. 「正しい」パッケージの場所を宛先ファイルに書き込みます
  6. ソースファイル内の「誤った」パッケージの場所をスキップします
  7. ソースファイルの残りの内容を宛先ファイルに書き込みます。

これにより、ファイルのパッケージが正しく「リベース」されることに注意してください。ただし、「古い」パッケージでそのファイルを見つけることを期待する可能性のある他のファイルを「リベース」することはできません。これらの他のファイルを修正するには(存在する場合、おそらくプロジェクトがそれほど多くの参照を持たないように設計されているか、すべてのファイルをコピーする予定です)、プロジェクト内の各ファイルを開いて、で「移動」クラスを探す必要があります。importステートメント。見つかった場合は、インポートをコピーするのではなく、正しい置換でコピーする必要があります。

実際には「移動」しないが変更が必要なファイルを操作する場合は、一時ファイルを作成し、一時ファイルが完全に書き込まれた後で元のファイルを一時ファイルに置き換えるのが最善の方法です。そのようです:

(reading) MyClass.java
(writing) .tempMyClass.java
(done writing)
(moving)  .tempMyClass.java to MyClass.java

これにより、読み取る必要のある場所を過ぎてファイルに書き込むなど、多くの厄介な項目に制約されないようにすることができます(これにより、読み取る前に必要な情報が破壊されます)。

パッケージjava.ioとクラスjava.lang.Stringには、これらのツールを作成するためのすべてのユーティリティが含まれていますが、詳細を説明するには、投稿が長すぎます。少し書いてみて、行き詰まったらWebを検索して(javaを使用してファイルから行を読み取る方法、javaを使用してファイルに行を書き込む方法)、取得した距離と特定のコードを投稿してくださいエラーや誤解、そして多くの人々が喜んでお手伝いします。

コンパイル済みのファイルに対してこれを実行する場合は、Javaクラスのファイル形式を少し読んで、クラス名の定数文字列を見つけ、上記と同様の手順で変更する必要があります(バイナリを書き込む場合を除く)バイト)、またはASMのようなライブラリを使用して、上記と同じ手順を実行できます(ただし、手動で実行する場合の間違いを防ぐことができます)。

于 2012-04-09T15:42:53.920 に答える
1

努力すればできるのに、

  1. Java ファイルを解析し、それらを更新します (簡単ではありませんpackage。コメントや文字列に単語が含まれている場合を考慮してください)。
  2. そして、それらを参照するすべてのクラスを更新する必要があります (これはさらに困難です。なぜなら、インポート ステートメントを変更し、完全修飾クラス名を変更し、同じパッケージ内のクラスにインポート ステートメントを追加する必要があるためです (それらは隣接していて、インポート ステートメントがなかったため)。 .

IDE (Eclipse、Netbeans、IDEA など) とそのリファクタリング機能を使用することをお勧めします。

于 2012-04-09T16:03:50.197 に答える