Kennt jemand von euch ein Tool, das nach .class-Dateien sucht und dann deren kompilierte Versionen anzeigt?
Ich weiß, dass Sie sie einzeln in einem Hex-Editor anzeigen können, aber ich muss viele Klassendateien überprüfen (etwas in meiner riesigen Anwendung wird aus irgendeinem Grund auf Java6 kompiliert).
jvm-bytecode
SCdF
quelle
quelle
Antworten:
Verwenden Sie das mit dem JDK gelieferte Javap- Tool. Die
-verbose
Option druckt die Versionsnummer der Klassendatei.So zeigen Sie nur die Version an:
quelle
Es ist einfach genug, die Signatur der Klassendatei zu lesen und diese Werte ohne eine API eines Drittanbieters abzurufen. Sie müssen lediglich die ersten 8 Bytes lesen.
Für die Klassendateiversion 51.0 (Java 7) lauten die öffnenden Bytes:
... wobei 0xCAFEBABE die magischen Bytes sind, 0x0000 die Nebenversion und 0x0033 die Hauptversion.
Das Gehen von Verzeichnissen ( Datei ) und Archiven ( JarFile ) nach Klassendateien ist trivial.
In Joe Darcys Blog von Oracle werden die Klassenversionen für JDK-Versionszuordnungen bis Java 7 aufgelistet :
quelle
Auf Unix-ähnlich
Gibt auch den Dateityp und die Version an. So sieht die Ausgabe aus:
quelle
Wenn Sie sich auf einem Unix-System befinden, können Sie einfach eine
(Meine Version der Datei sagt "kompilierte Java-Klassendaten, Version 50.0" für Java6-Klassen).
quelle
file *.class
Erzeugt:ClassName.class: compiled Java class data, version 50.0 (Java 1.6)
Noch eine Java-Versionsprüfung
quelle
In Eclipse, wenn Sie keine Quellen angehängt haben. Beachten Sie die erste Zeile nach der Schaltfläche zum Anhängen der Quelle.
// Kompiliert aus CDestinoLog.java ( Version 1.5: 49.0, Superbit )
quelle
Vielleicht hilft das auch jemandem. Anscheinend gibt es eine einfachere Möglichkeit, die JAVA-Version zum Kompilieren / Erstellen von .class zu verwenden. Diese Methode ist nützlich, um die Anwendung / Klasse in der JAVA-Version selbst zu überprüfen.
Ich habe die JDK-Bibliothek durchgesehen und diese nützliche Konstante gefunden: com.sun.deploy.config.BuiltInProperties.CURRENT_VERSION . Ich weiß nicht, wann es in JAVA JDK ist.
Wenn ich diesen Code für mehrere Versionskonstanten versuche, erhalte ich das folgende Ergebnis:
src:
Ausgabe:
Im Klassenbytecode ist wirklich eine Konstante gespeichert - siehe rot markierten Teil von Main.call - Konstante, die im Klassenbytecode gespeichert ist
Die Konstante wird in der Klasse verwendet, um zu überprüfen, ob die JAVA-Version veraltet ist (siehe Wie Java überprüft, ob sie veraltet ist ) ...
quelle
Eine Java-basierte Lösung mit magischen Versionszahlen . Darunter wird es vom Programm selbst verwendet, um seine Bytecode-Version zu erkennen.
quelle
Diese Java-Klasse durchsucht den Inhalt aller WAR-Inhalte und JARs, die in der Liste der Verzeichnisse aufgeführt sind, und druckt eine Zusammenfassung der Java-Klassendateiversionen für jede Komponente, einschließlich jeder JAR in WARs:
quelle