Java .class dosyalarını insan tarafından okunabilir bir şekilde nasıl açabilirim?


111

Bir Java uygulamasının sınıf dosyasının kaputun altında ne yaptığını anlamaya çalışıyorum. Not Defteri veya Textpad ile açmak sadece bir sürü gobbledy-gook gösteriyor.

Ne yaptığını anlamaya çalışabilmek için onu biraz okunabilir bir biçime geri döndürmenin bir yolu var mı?

  • Ortam == Windows w / VS 2008 yüklü.

7
Sadece anlamsal bir şey, bir = iki değil mi? == bir sorudur while = bir ifadedir ve çevreniz hakkında bir açıklama yaparsınız.
icco

Bu soruyu netleştirebilir misin? Aklıma ilk gelen düşüncem, gerçek bayt kodunu okumak istediğin oldu, ama görünüşe göre aslında başka birinin kodunu çözmek istiyorsun.
Outlaw Programmer

12
@icco, = atama, == eşitlik anlamına gelir. (Environment == Windows w / VS2008 kurulu) 'nun doğru olduğunu, Ortamı VS2008 yüklü Windows olarak ayarlamak için bir emir vermediğini söylüyor. Konu dışı ve inek olan adam.
Blorgbeard

7
Kayıt için == eşitlik beyan etmez; eşitliği test eder. True == false yazabilirsiniz ve bu, Environment == Windows w / VS 2008 kurulu olarak yazmak kadar anlamlıdır, yani hiç anlamlı değil.
bwerks

Yanıtlar:


208

jd-gui şu anda en iyi derleyicidir. gittikçe tozlanmaya başlayan JAD ile karşılaştırıldığında Java'daki daha yeni özelliklerin üstesinden gelebilir.


1
Bu cevap 2020'de ne kadar güncel?
Kodlama Wombat

Bağlantı bir yere gittiği sürece, sanırım iyi. Uzun zamandır Java kullanmadığım için artık daha iyi bir Java kod çözücüsü olup olmadığını bilmiyorum.
DarenW

77

Bayt kodunu okumaktan çekinmiyorsanız, javap iyi çalışmalıdır. Standart JDK kurulumunun bir parçasıdır.

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 tarafından belirtildiği gibi, şunu kullanın:

javap -c <name of java class file> 

JVM montaj kodunu almak için. Daha iyi görünürlük için çıktıyı bir metin dosyasına da yeniden yönlendirebilirsiniz.

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


2

aradığınız şey bir java derleyicisidir. JAD'i tavsiye ederim http://www.kpdus.com/jad.html Ticari olmayan kullanım için ücretsizdir ve işi bitirir.

Not: Bu, kodu yazılanla tam olarak aynı yapmaz. yani yorumları ve muhtemelen değişken isimleri kaybedeceksiniz, bu yüzden normal kaynak kodunu okumaktan biraz daha zor olacak. Geliştirici gerçekten gizliyse, kodunu da gizlemiş olacak ve bu da okumayı daha da zorlaştıracaktır.


2

cpuguru, eğer uygulamanız javac 1.3 (veya daha azı) ile derlenmişse, en iyi seçeneğiniz Jad kullanmaktır.

Ne yazık ki, JAD 1.5.8 (14 Nisan 2001) tarafından desteklenen son JDK, JDK 1.3'tür.

Uygulamanız daha yeni bir derleyici ile derlenmişse, JD-GUI'yi deneyebilirsiniz : bu derleyici geliştirme aşamasındadır, yine de, JDK 1.4, 1.5 veya 1.6 ile derlenen sınıflar için çoğu zaman doğru Java kaynakları üretir.

DarenW, gönderiniz için teşekkür ederim. JD-GUI henüz en iyi derleyici değil ... ama üzerinde çalışıyorum :)





1

Bir derleyici kullanmalısınız. Diğerleri JAD'yi önerdi, başka seçenekler var, JAD en iyisidir.

Orijinal kaynak koduna kıyasla biraz kaybedebileceğiniz yorumları tekrarlayacağım. Kodun silinmesi nedeniyle jenerik kullanması özellikle komik görünecektir.



1

Bakmak istediğiniz sınıf dosyası açık kaynaklı ise, derlemesini çözmemelisiniz, bunun yerine kaynak dosyaları doğrudan IDE'nize eklemelisiniz. bu şekilde, bir kütüphane sınıfının kodunu kendinizinmiş gibi görüntüleyebilirsiniz.


0

Önerildiği gibi, JAD'i derlemeyi çözmek ve dosyaları görüntülemek için kullanabilirsiniz. Okumayı kolaylaştırmak için JADclipse eklentisini JAD'i doğrudan tutulmaya entegre etmek için JADclipse eklentisini kullanabilir veya JAD komut satırından çok daha kolay olan DJ Java Decompiler'ı kullanabilirsiniz.


0

Sonuç olarak okunabilir Java kodu istiyorsanız JAD mükemmel bir seçenektir. .classYine de dosya formatının iç kısımlarını gerçekten araştırmak istiyorsanız , isteyeceksiniz javap. JDK ile paketlenmiştir ve onaltılık bayt kodunu okunabilir ASCII'ye "yeniden derlemenize" izin verir. Ürettiği dil hala bayt kodudur (Java gibi bir şey değildir), ancak oldukça okunabilir ve son derece öğreticidir.

Ayrıca, gerçekten isterseniz, herhangi bir .classdosyayı bir onaltılık düzenleyicide açabilir ve bayt kodunu doğrudan okuyabilirsiniz. Sonuç, kullanmakla aynıdır javap.


0

Applet.class dosyasını yeniden derlemeye gerek yoktur. Genel Java API sınıflarının kaynak kodu, JDK ile birlikte gelir (yüklemeyi seçerseniz) ve derlenmiş bayt kodundan daha iyi okunabilir. Src.zip'de sıkıştırılmış bulabilirsiniz (JDK kurulum klasörünüzde bulunur).



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.