Bagaimana saya bisa membuka file Java .class dengan cara yang bisa dibaca manusia?

111

Saya mencoba untuk mencari tahu apa yang dilakukan file kelas applet Java di bawah tenda. Membukanya dengan Notepad atau Textpad hanya menunjukkan sekelompok orang bodoh.

Apakah ada cara untuk menyatukannya kembali menjadi format yang agak mudah dibaca sehingga saya dapat mencoba mencari tahu apa yang dilakukannya?

  • Lingkungan == Windows w / VS 2008 diinstal.
cpuguru
sumber
7
Hanya hal semantik, bukankah seharusnya satu = bukan dua? == adalah pertanyaan sementara = adalah pernyataan dan Anda membuat pernyataan tentang lingkungan Anda.
icco
Bisakah Anda menjelaskan pertanyaan ini? Pikiran langsung saya adalah Anda ingin membaca bytecode yang sebenarnya, tetapi tampaknya Anda benar-benar ingin mendekompilasi kode orang lain.
Outlaw Programmer
12
@icco, = artinya penugasan, == artinya kesetaraan. Dia mengatakan bahwa (Lingkungan == Windows w / VS2008 terinstal) adalah benar, tidak memberikan perintah untuk mengatur Lingkungan ke Windows w / VS2008 diinstal. Pria yang offtopic dan kutu buku.
Blorgbeard keluar
7
Sebagai catatan == tidak menyatakan kesetaraan; itu menguji kesetaraan. Anda dapat menulis true == false, dan ini sama artinya dengan menulis Environment == Windows w / VS 2008 terinstal, artinya tidak bermakna sama sekali.
bwerks

Jawaban:

208

jd-gui adalah decompiler terbaik saat ini. itu dapat menangani fitur-fitur baru di Java, dibandingkan dengan JAD yang semakin berdebu.

DarenW
sumber
1
Seberapa terkini jawaban ini di tahun 2020?
The Coding Wombat
Selama tautannya mengarah ke suatu tempat, saya kira itu bagus. Saya tidak akan tahu apakah sekarang ada dekompiler Java yang lebih baik, karena saya belum pernah menggunakan Java sejak lama.
DarenW
77

Jika Anda tidak keberatan membaca bytecode, javap seharusnya berfungsi dengan baik. Ini bagian dari instalasi JDK standar.

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
Michael Myers
sumber
9

Seperti yang ditunjukkan oleh @MichaelMyers, gunakan

javap -c <name of java class file> 

untuk mendapatkan kode perakitan JVM. Anda juga dapat mengarahkan output ke file teks untuk visibilitas yang lebih baik.

javap -c <name of java class file> > decompiled.txt
Nilashish C
sumber
7

Anda menginginkan java decompiler, Anda dapat menggunakan alat baris perintah javapuntuk melakukan ini. Juga, Java Decompiler HOW-TO menjelaskan bagaimana Anda dapat mendekompilasi file kelas.

Drew Frezell
sumber
2

apa yang Anda cari adalah java de-compiler. Saya merekomendasikan JAD http://www.kpdus.com/jad.html Gratis untuk penggunaan non komersial dan menyelesaikan pekerjaan.

Catatan: ini tidak akan membuat kode sama persis dengan yang tertulis. misalnya Anda akan kehilangan komentar dan mungkin nama variabel, jadi ini akan menjadi sedikit lebih sulit daripada hanya membaca kode sumber biasa. Jika pengembang benar-benar tertutup, mereka juga akan mengaburkan kode mereka, membuatnya lebih sulit untuk dibaca.

David Beleznay
sumber
2

cpuguru, jika applet Anda telah dikompilasi dengan javac 1.3 (atau kurang), pilihan terbaik Anda adalah menggunakan Jad.

Sayangnya, JDK terakhir yang didukung oleh JAD 1.5.8 (14 Apr 2001) adalah JDK 1.3.

Jika applet Anda telah dikompilasi dengan kompilator yang lebih baru, Anda dapat mencoba JD-GUI : dekompiler ini sedang dalam pengembangan, namun, ia menghasilkan sumber Java yang benar, sebagian besar, untuk kelas yang dikompilasi dengan JDK 1.4, 1.5 atau 1.6.

DarenW, terima kasih atas kiriman Anda. JD-GUI bukanlah decompiler terbaik ... tapi saya sedang mengerjakan :)

Emmanuel Dupuy
sumber
2

Menggunakan Jad untuk mendekompilasi mungkin adalah pilihan terbaik Anda. Kecuali kode telah dikaburkan, itu akan menghasilkan hasil yang oke.

Rasmus Faber
sumber
1

Anda perlu menggunakan decompiler. Orang lain menyarankan JAD, ada pilihan lain, JAD adalah yang terbaik.

Saya akan menggemakan komentar yang mungkin Anda kehilangan sedikit dibandingkan dengan kode sumber aslinya. Ini akan terlihat sangat lucu jika kode yang digunakan generik, karena terhapus.

Zac Gochenour
sumber
1

JAD dan / atau JADclipse Eclipse plugin, pasti.

John Gardner
sumber
1

Jika file kelas yang ingin Anda lihat adalah open source, Anda tidak boleh mendekompilasinya, tetapi melampirkan file sumber langsung ke IDE Anda. dengan begitu, Anda bisa melihat kode dari beberapa kelas perpustakaan seolah-olah itu milik Anda sendiri

arturh
sumber
0

Seperti yang disarankan, Anda dapat menggunakan JAD untuk mendekompilasi dan melihat file. Agar lebih mudah dibaca dapat menggunakan plugin JADclipse for eclipse untuk mengintegrasikan JAD langsung ke eclipse atau menggunakan DJ Java Decompiler yang jauh lebih mudah digunakan daripada command line JAD


sumber
0

JAD adalah opsi yang sangat baik jika Anda menginginkan kode Java yang dapat dibaca sebagai hasilnya. Jika Anda benar-benar ingin menggali internal .classformat file, Anda pasti menginginkannya javap. Ini dibundel dengan JDK dan memungkinkan Anda untuk "mendekompilasi" bytecode heksadesimal menjadi ASCII yang dapat dibaca. Bahasa yang dihasilkannya masih bytecode (tidak seperti Java), tetapi cukup mudah dibaca dan sangat instruktif.

Selain itu, jika Anda benar - benar ingin, Anda dapat membuka .classfile apa pun di editor hex dan membaca bytecode secara langsung. Hasilnya identik dengan menggunakan javap.

Daniel Spiewak
sumber
0

Tidak perlu mendekompilasi Applet.class. Kode sumber kelas Java API publik dilengkapi dengan JDK (jika Anda memilih untuk menginstalnya), dan lebih mudah dibaca daripada bytecode yang didekompilasi. Anda dapat menemukan file terkompresi di src.zip (terletak di folder instalasi JDK Anda).

Arno
sumber