أداة لقراءة وعرض إصدارات Java .class
-
09-06-2019 - |
سؤال
هل يعرف أي منكم أداة تبحث عن ملفات .class ثم تعرض إصداراتها المجمعة؟
أعلم أنه يمكنك الاطلاع عليها بشكل فردي في محرر سداسي عشري ولكن لدي الكثير من ملفات الفئة التي يجب الاطلاع عليها (هناك شيء ما في تطبيقي العملاق يتم تجميعه إلى Java6 لسبب ما).
المحلول
استخدم ال javap الأداة التي تأتي مع JDK.ال -verbose
سيقوم الخيار بطباعة رقم إصدار ملف الفئة.
> javap -verbose MyClass
Compiled from "MyClass.java"
public class MyClass
SourceFile: "MyClass.java"
minor version: 0
major version: 46
...
لإظهار الإصدار فقط:
WINDOWS> javap -verbose MyClass | find "version"
LINUX > javap -verbose MyClass | grep version
نصائح أخرى
من السهل بما فيه الكفاية قراءة توقيع ملف الفصل واحصل على هذه القيم بدون واجهة برمجة تطبيقات تابعة لجهة خارجية.كل ما عليك فعله هو قراءة أول 8 بايتات.
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
بالنسبة لإصدار ملف الفئة 51.0 (Java 7)، فإن وحدات البايت الافتتاحية هي:
CA FE BA BE 00 00 00 33
...حيث 0xCAFEBABE هي البايتات السحرية، و0x0000 هو الإصدار الثانوي و0x0033 هو الإصدار الرئيسي.
import java.io.*;
public class Demo {
public static void main(String[] args) throws IOException {
ClassLoader loader = Demo.class.getClassLoader();
try (InputStream in = loader.getResourceAsStream("Demo.class");
DataInputStream data = new DataInputStream(in)) {
if (0xCAFEBABE != data.readInt()) {
throw new IOException("invalid header");
}
int minor = data.readUnsignedShort();
int major = data.readUnsignedShort();
System.out.println(major + "." + minor);
}
}
}
الدلائل المتحركة (ملف) والمحفوظات (جارملف) البحث عن ملفات الفصل أمر تافه.
أوراكل مدونة جو دارسي يسرد إصدار الفئة إلى تعيينات إصدار JDK حتى جافا 7:
Target Major.minor Hex
1.1 45.3 0x2D
1.2 46.0 0x2E
1.3 47.0 0x2F
1.4 48.0 0x30
5 (1.5) 49.0 0x31
6 (1.6) 50.0 0x32
7 (1.7) 51.0 0x33
8 (1.8) 52.0 0x34
9 53.0 0x35
على غرار يونكس
file /path/to/Thing.class
سيعطي نوع الملف وإصداره أيضًا.إليك ما يبدو عليه الإخراج:
بيانات فئة Java المجمعة، الإصدار 49.0
إذا كنت تستخدم نظام يونكس، فيمكنك القيام بذلك
find /target-folder -name \*.class | xargs file | grep "version 50\.0"
(إصدار الملف الخاص بي يقول "بيانات فئة Java المترجمة، الإصدار 50.0" لفئات Java6).
فحص آخر لإصدار جافا
od -t d -j 7 -N 1 ApplicationContextProvider.class | head -1 | awk '{print "Java", $2 - 44}'
ربما هذا يساعد شخص ما أيضا.يبدو أن هناك طريقة أكثر سهولة لاستخدام إصدار JAVA لتجميع/إنشاء .class.هذه الطريقة مفيدة للتحقق الذاتي من التطبيق/الفئة على إصدار JAVA.
لقد قمت بزيارة مكتبة JDK ووجدت هذا الثابت المفيد:com.sun.deploy.config.BuiltInProperties.CURRENT_VERSION.لا أعرف منذ متى كان موجودًا في JAVA JDK.
تجربة هذا الجزء من التعليمات البرمجية للعديد من ثوابت الإصدار أحصل على النتيجة أدناه:
سرك:
System.out.println("JAVA DEV ver.: " + com.sun.deploy.config.BuiltInProperties.CURRENT_VERSION);
System.out.println("JAVA RUN v. X.Y: " + System.getProperty("java.specification.version") );
System.out.println("JAVA RUN v. W.X.Y.Z: " + com.sun.deploy.config.Config.getJavaVersion() ); //_javaVersionProperty
System.out.println("JAVA RUN full ver.: " + System.getProperty("java.runtime.version") + " (may return unknown)" );
System.out.println("JAVA RUN type: " + com.sun.deploy.config.Config.getJavaRuntimeNameProperty() );
انتاج:
JAVA DEV ver.: 1.8.0_77
JAVA RUN v. X.Y: 1.8
JAVA RUN v. W.X.Y.Z: 1.8.0_91
JAVA RUN full ver.: 1.8.0_91-b14 (may return unknown)
JAVA RUN type: Java(TM) SE Runtime Environment
يوجد بالفعل ثابت مخزن في كود البايت الخاص بالفئة - راجع الجزء المميز باللون الأحمر من Main.call - ثابت مخزن في .class bytecode
الثابت موجود في الفصل المستخدم للتحقق مما إذا كان إصدار JAVA قديمًا (انظر كيف تتحقق Java من أن هذا قديم)...