.class
ファイルをファイルに変換することは可能.java
ですか?
これはどのように行うことができますか?
このオプションから抽出されたコードの正確さはどうですか?
可能です。これを行うには、Javaデコンパイラが必要です。
ほとんどの場合、驚くほど良い仕事をするでしょう。.java
取得するのは、ファイルにコンパイルされる有効なファイル.class
ですが、この.java
ファイルは必ずしも元のソースコードと同じであるとは限りません。ループ構造のようなものは異なって出てくるかもしれません、そしてジェネリックスやアノテーションのようなコンパイル時だけのものは再作成されません。
コードが難読化されている場合は、問題が発生する可能性があります。これは、クラスファイルを変更して逆コンパイルを困難にするプロセスです。たとえば、クラス名と変数名がすべて類似するように変更されているため、aa.a(ab)
代わりにのようなコードemployee.setName(name)
になってしまい、何が起こっているのかを理解するのは非常に困難です。
これを行うためにJADを使用したことを覚えていますが、これが積極的に維持されているとは思わないため、Javaのバージョンがない場合は機能しない可能性があります。GoogleでJava逆コンパイラを検索すると、たくさんのオプションが表示されます。
これは、利用可能なJavaデコンパイラの1つを使用して可能です。コンパイラによって最適化された可能性のあるバイトコード(静的変数のインライン化、制御フローの再構築など)から作業しているため、最初にコンパイルされたコードとまったく同じではない場合がありますが、機能的には同等です。
以前の回答に加えて:最近、逆コンパイラの新しい波が来ています、すなわち、Procyon、CFR、JD、Fernflower
2015年3月現在の最新の逆コンパイラのリストは次のとおりです。
上記の逆コンパイラをオンラインでテストできます。インストールは不要で、知識に基づいて独自に選択できます。 クラウド内のJavaデコンパイラー: http ://www.javadecompilers.com/
正確には逆コンパイラではありませんが、JDKには逆アセンブラであるjavapが含まれています。
javap -c org.example.MyClass
ユースケースによっては、それでも知ったり使用したりするのは興味深いかもしれません。
クラスファイルの逆コンパイルの結果は、クラスファイルに含まれる情報に依存することに注意してください。私の記憶が正しければ、特に変数の命名などには、含まれているデバッグ情報( javacの-gフラグを参照)が重要です。
それは常に可能です。「javadisassembler」を検索します。
ただし、ソースコードのコメントと一時変数は使用できません。
クラスを逆コンパイルして、コードが変数名で複雑すぎて、メソッド名がa、b、c ...のようになっている場合は、プロジェクトが難読化されていることを意味します。
DJは使いやすいJavaデコンパイラーです。.classファイルを開くだけで、そのjava
コードが表示されます。
また、 Eclipse用のjadClipseプラグインを使用して、.classを.javaに直接逆コンパイルすることもできます。
What about the correctness of the code extracted from this option?
いずれの場合も、Javaデコンパイラーによって生成されるコードは、元のJavaクラスで作成されたものと同じではありません。バイトコードをJavaコードにデコードするだけです。確実にできる唯一のことは、出力が元のJavaコードの出力と同じになるということです。