人間が読める方法でJava .classファイルを開くにはどうすればよいですか?


111

私は、Javaアプレットのクラスファイルが内部で何をしているかを理解しようとしています。NotepadまたはTextpadでそれを開くと、大量のゴブルディグックが表示されます。

それをやや読みやすい形式に戻す方法はありますか?それで私はそれが何をしているのか理解しようとすることができますか?

  • 環境== VS 2008がインストールされたWindows。

7
意味論的なことだけですが、2つではなく1つではないのですか?==は質問であり、=は発言であり、あなたはあなたの環境について発言している。
icco 2008

この質問を明確にできますか?私の直接の考えは、実際のバイトコードを読みたいと思っていましたが、実際には他の誰かのコードを逆コンパイルしたいようです。
アウトロープログラマー

12
@ icco、=は代入を意味し、==は平等を意味します。彼は、(環境== VS2008がインストールされたWindows)がtrueであり、環境をVS2008がインストールされたWindowsに設定する命令を与えていないと述べています。話題とオタクだった男。
Blorgbeardは

7
レコードの==は等号を宣言しません。同等性をテストします。あなたはtrue == falseと書くことができ、それは環境を書くのとほぼ同じくらい意味があります== VS 2008がインストールされたWindows、つまりまったく意味がありません。
bwerks 2013年

回答:


208

jd-guiは現時点で最高の逆コンパイラです。ほこりっぽいJADと比較して、Javaの新しい機能を処理できます。


この回答は2020年にどのくらい最新ですか。
コーディングウォンバット

リンクがどこかにある限り、私はそれが良いと思います。私はずっと以前からJavaを使用していないので、より良いJavaデコンパイラーがあるかどうかはわかりません。
DarenW

77

バイトコードを読んでも構わないのであれば、javapは問題なく動作するはずです。これは、標準のJDKインストールの一部です。

Usage: javap <options> <classes>...

where options include:
   -c                        Disassemble the code
   -classpath <pathlist>     Specify where to find user class files
   -extdirs <dirs>           Override location of installed extensions
   -help                     Print this usage message
   -J<flag>                  Pass <flag> directly to the runtime system
   -l                        Print line number and local variable tables
   -public                   Show only public classes and members
   -protected                Show protected/public classes and members
   -package                  Show package/protected/public classes
                             and members (default)
   -private                  Show all classes and members
   -s                        Print internal type signatures
   -bootclasspath <pathlist> Override location of class files loaded
                             by the bootstrap class loader
   -verbose                  Print stack size, number of locals and args for methods
                             If verifying, print reasons for failure

9

@MichaelMyersで指摘されているように、

javap -c <name of java class file> 

JVMアセンブリコードを取得します。見やすくするために、出力をテキストファイルにリダイレクトすることもできます。

javap -c <name of java class file> > decompiled.txt


2

あなたが探しているのは、Java逆コンパイラです。JADをお勧めしますhttp://www.kpdus.com/jad.html 非営利目的の使用は無料で、仕事をこなします。

注:これによって、コードが記述されたものとまったく同じになるわけではありません。つまり、コメントや変数名が失われる可能性があるため、通常のソースコードを読み取るよりも少し難しくなります。開発者が本当に秘密にされている場合、彼らもコードを難読化して読みにくくしています。


2

cpuguru、アプレットがjavac 1.3(またはそれ以下)でコンパイルされている場合、最善のオプションはJadを使用することです。

残念ながら、JAD 1.5.8(2001年4月14日)でサポートされている最後のJDKはJDK 1.3です。

アプレットが最新のコンパイラでコンパイルされている場合は、JD-GUIを試すことができます。このデコンパイラは開発中ですが、JDK 1.4、1.5、または1.6でコンパイルされたクラスに対して、ほとんどの場合、正しいJavaソースを生成します。

DarenW、投稿ありがとうございます。JD-GUIはまだ最高のデコンパイラーではありません...しかし、私は作業中です:)




1

これはコンパイルされたコードです。JADのような逆コンパイラを使用する必要があります:http ://www.kpdus.com/jad.html


1

デコンパイラーを使用する必要があります。他の人はJADを提案しました、他のオプションがあり、JADが最高です。

元のソースコードと比較して少し失う可能性があるというコメントをエコーし​​ます。消去のため、コードがジェネリックを使用している場合は特におかしくなります。



1

調べたいクラスファイルがオープンソースである場合、それを逆コンパイルするのではなく、ソースファイルを直接IDEに添付する必要があります。そうすれば、いくつかのライブラリクラスのコードを、自分のコードのように表示できます。


0

提案されているように、JADを使用して逆コンパイルしてファイルを表示できます。読みやすくするために、EclipseのJADclipseプラグインを使用してJADを直接Eclipseに統合するか、コマンドラインJADよりもはるかに使いやすいDJ Java Decompilerを使用できます。


0

JADは、結果として読みやすいJavaコードが必要な場合に最適なオプションです。.classただし、ファイル形式の内部を掘り下げたい場合は、その必要がありますjavap。これはJDKにバンドルされており、16進数のバイトコードを読み取り可能なASCIIに「逆コンパイル」できます。それが生成する言語はまだバイトコード(Javaのようなものではありません)ですが、かなり読みやすく、非常に有益です。

また、本当に必要な場合.classは、16進エディタで任意のファイルを開き、バイトコードを直接読み取ることができます。結果はを使用した場合と同じですjavap


0

Applet.classを逆コンパイルする必要はありません。パブリックJava APIクラスのソースコードはJDKに付属しており(インストールすることを選択した場合)、逆コンパイルされたバイトコードよりも読みやすくなります。圧縮はsrc.zip(JDKインストールフォルダーにあります)にあります。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.