Czy ktoś z was zna narzędzie, które wyszuka pliki .class, a następnie wyświetli ich skompilowane wersje?
Wiem, że możesz spojrzeć na nie indywidualnie w edytorze szesnastkowym, ale mam wiele plików klas do przejrzenia (coś w mojej gigantycznej aplikacji z jakiegoś powodu kompiluje się do Java6).
jvm-bytecode
SCdF
źródło
źródło
Odpowiedzi:
Użyj narzędzia javap dostarczonego z JDK.
-verbose
Opcja zostanie wydrukowany numer wersji pliku klasy.Aby pokazać tylko wersję:
źródło
Odczytanie podpisu pliku klasy i uzyskanie tych wartości jest dość łatwe bez zewnętrznego interfejsu API. Wszystko, co musisz zrobić, to przeczytać pierwsze 8 bajtów.
W przypadku pliku klasy w wersji 51.0 (Java 7) bajty otwierające to:
... gdzie 0xCAFEBABE to magiczne bajty, 0x0000 to wersja pomocnicza, a 0x0033 to wersja główna.
Chodzenie po katalogach ( plik ) i archiwach ( JarFile ) w poszukiwaniu plików klas jest banalne.
Blog Oracle Joe Darcy wymienia wersje klas do wersji JDK do Java 7:
źródło
W systemie Unix
Poda również typ i wersję pliku. Oto jak wygląda wynik:
źródło
Jeśli korzystasz z systemu uniksowego, możesz po prostu zrobić plik
(moja wersja pliku mówi „skompilowane dane klasy Java, wersja 50.0” dla klas java6).
źródło
file *.class
produkuje:ClassName.class: compiled Java class data, version 50.0 (Java 1.6)
Jeszcze jedno sprawdzenie wersji Java
źródło
W zaćmieniu, jeśli nie masz dołączonych źródeł. Zwróć uwagę na pierwszą linię po przycisku dołączania źródła.
// Skompilowany z CDestinoLog.java ( wersja 1.5: 49.0, super bit )
źródło
Może to też komuś pomoże. Wygląda na to, że jest łatwiejszy sposób na uzyskanie wersji JAVA używanej do kompilowania / budowania .class. Ten sposób jest przydatny do samodzielnego sprawdzania aplikacji / klasy w wersji JAVA.
Przejrzałem bibliotekę JDK i znalazłem tę przydatną stałą: com.sun.deploy.config.BuiltInProperties.CURRENT_VERSION . Nie wiem od kiedy jest w JAVA JDK.
Próbując tego fragmentu kodu dla kilku stałych wersji otrzymuję wynik poniżej:
src:
wynik:
W kodzie bajtowym klasy jest naprawdę przechowywana stała - patrz zaznaczona na czerwono część Main.call - stała przechowywana w kodzie bajtowym .class
Stała jest w klasie używanej do sprawdzania, czy wersja JAVA jest nieaktualna (zobacz Jak Java sprawdza, czy jest nieaktualna ) ...
źródło
Rozwiązanie oparte na Javie, korzystające z numerów magicznych wersji . Poniżej jest używany przez sam program do wykrywania wersji kodu bajtowego.
źródło
Ta klasa Java skanuje zawartość całej zawartości WAR i plików JAR znajdujących się pod listą katalogów i drukuje podsumowanie wersji plików klas Java dla każdego komponentu, w tym każdego pliku JAR w ramach WAR:
źródło