سؤال

هل يعرف أي منكم أداة تبحث عن ملفات .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}'

في Eclipse إذا لم يكن لديك مصادر مرفقة.انتبه للسطر الأول بعد زر إرفاق المصدر.

// تم تجميعها من CDestinoLog.java (الإصدار 1.5 :49.0، سوبر بت)

enter image description here

ربما هذا يساعد شخص ما أيضا.يبدو أن هناك طريقة أكثر سهولة لاستخدام إصدار 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 من أن هذا قديم)...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top