1

いくつかの Java クラスが利用可能なプログラムがあります。それらを逆コンパイルすることは可能ですか?.classクラスのソース コードを変更して、他のすべてのファイルを持たずに再コンパイルすることは可能ですか?

たとえば、dog.classで定義されている animal のサブクラスを実装するファイルがあるとしanimal.classます。

  • dog.javaなしで再コンパイルできanimal.classますか?
  • dog.javaなしで再コンパイルできanimal.javaますか?

私は Java 開発者ではないので、意味が分からない場合は訂正してください。

4

6 に答える 6

3

実際にクラスを使用するにはclassファイルが必要ですが、ソース ファイルが必要になるわけではありません。

DogandAnimalクラスの例を使用して可能性を見てみましょう。Dogクラスがクラスのサブクラスであると仮定するとAnimal、次のことができます。

  • Animal.classとの両方があればAnimal.javaDogクラスを作成できます。

  • 持っていても持ってAnimal.classいない場合は、クラスAnimal.javaを作成できます。Dog

  • 持っていなくてAnimal.classも、クラスAnimal.javaを作成できます。Dog(これは、Animal.javaファイルのコンパイル時にファイルをコンパイルする必要があることを意味しますDog.java。)

  • どちらAnimal.classも持っていないと、クラスAnimal.javaを作ることができません。Dog

上記の表バージョンは次のとおりです。

Animal.java をお持ちですか? Animal.class はありますか? ドッグクラスは作れますか?
 ----------------- ------------------ --------------- ----
        はい はい --> はい
        はい いいえ --> はい
        いいえ はい --> はい
        いいえ いいえ --> いいえ

ファイルがある場合、ファイルを逆コンパイルして人間が読めるソース ファイルを生成classできるプログラムがありますが、ファイルの生成に使用された正確なソースを復元することはできません。classjavaclass

ただし、この場合、クラスを拡張しAnimalて新しいDogクラスを作成するだけであれば、ソースコード自体は必要ありません。

これを念頭に置いてください。Java で作成されたクラスは常にObjectクラスを拡張します。Objectクラスのソース コードにアクセスできなくてもObject.class、Java でアクセスできるため、独自のクラスを作成できます。

このケースも同様classです。クラス用のファイルがあれば、それを最大限に使用できます。欠けている唯一のものは、ソース コードにリストされている実際の実装です。

于 2009-06-13T08:01:30.910 に答える
1

コンパイルされたクラス (この例ではanimal.class) にアクセスできる場合は、サブクラス (dog.java) を再コンパイルできます (ただし、スーパークラスのソース コードにアクセスする必要はありません)。

コンパイルされたスーパークラスにアクセスすることさえできない場合でも、関連するメソッド (サブクラスから実装または呼び出されるメソッド) を知っていれば、サブクラスをコンパイルするためだけにスーパークラスのスタブを作成できます。

ただし、ある時点で、コードを正しく実行できるようにするために、コンパイルされたスーパークラスの実際のバージョンが必要になります...

于 2009-06-13T08:00:29.493 に答える
1

一般的に、いいえ。ただし、欠落しているクラスのスタブを作成し (コンパイルのためだけに)、元のクラスがある場合に置き換えることができます。

于 2009-06-13T07:48:33.610 に答える
0

私の 2 セント: 一部の逆コンパイラは、物理レベルでのクラスの逆コンパイルを防ぎます (たとえば、一部の逆コンパイラでは、逆コンパイル プロセス中にクラッシュが発生します)。私が逆コンパイラで遭遇した追加の問題は、注釈をサポートしているものはほとんどありません。私の場合、クラスを逆コンパイルしようとすると、デッドロックが発生しました。コードには注釈が含まれていますが、注釈をサポートしていないdecompilerによってのみクラッシュなしで逆コンパイルできます。

于 2009-06-15T05:47:31.973 に答える
0

他の回答に追加するために、注意が必要な側面の1つは、クラスに複雑な構造がある場合、逆コンパイラがそれを「再コンパイル可能な」状態に逆コンパイルできない可能性があり、手動で編集する必要がある場合があることです。

于 2009-06-13T08:18:06.037 に答える
0

クラスを実行して逆コンパイルできる場合は、改訂された Java ファイルをコンパイルするために必要なクラスがあります (それらをクラスパスに含めた場合)。

新しいクラスファイルを有効にするには、クラスパス上の元のクラスの「前」にある必要があることに注意してください。

また、「封印されたjarファイル」では、このトリックでクラスを変更できないことに注意してください。

于 2009-06-13T13:44:51.507 に答える