Java API для обнаружения JDK присваивает версию файлу класса, компилируется для?

Можно использовать MultiBinding + StringFormat (требует WPF 3.5 SP1):


    
      
      
    

Относительно Выполнения. Текст - Вы не можете связать с ним, но существуют некоторые обходные решения:

36
задан Community 23 May 2017 в 12:34
поделиться

6 ответов

import java.io.*;
public class ClassVersionChecker {
public static void main(String[] args) throws IOException {
    for (int i = 0; i < args.length; i++)
        checkClassVersion(args[i]);
}

    private static void checkClassVersion(String filename)
        throws IOException
    {
        DataInputStream in = new DataInputStream
         (new FileInputStream(filename));

        int magic = in.readInt();
        if(magic != 0xcafebabe) {
          System.out.println(filename + " is not a valid class!");;
        }
        int minor = in.readUnsignedShort();
        int major = in.readUnsignedShort();
        System.out.println(filename + ": " + major + " . " + minor);
        in.close();
    }
}

Возможные значения:

major  minor Java platform version 
45       3           1.0
45       3           1.1
46       0           1.2
47       0           1.3
48       0           1.4
49       0           5
50       0           6
51       0           7
52       0           8
53       0           9
54       0           10
55       0           11
51
ответ дан 27 November 2019 в 05:24
поделиться

Apache BCEL предоставляет этот API:

JavaClass c = Repository.lookupClass("com.x.MyClass")
c.getMinor();
c.getMajor();
7
ответ дан 27 November 2019 в 05:24
поделиться

Как показали другие, это достаточно легко сделать, прочитав первые восемь байтов файла класса. Если вам нужна предварительно созданная двоичная библиотека, вы можете загрузить ее здесь .

2
ответ дан 27 November 2019 в 05:24
поделиться

Это дает вам содержимое файла класса:

MysteryClass.class.getResourceAsStream ("MysteryClass. class ")

Затем посмотрите байты 5-8, чтобы получить младшую и основную версии. Соответствие между этими числами и выпусками JDK можно найти здесь .

8
ответ дан 27 November 2019 в 05:24
поделиться

Просто прочтите файл класса напрямую. С версией ОЧЕНЬ легко разобраться. Ознакомьтесь со спецификацией и вики , а затем попробуйте код. Обернуть этот код и сделать его более полезным / красивым остается в качестве упражнения. В качестве альтернативы вы можете использовать такую ​​библиотеку, как BCEL , ASM или JavaAssist

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class ClassVersionTest
{
    private static final int JAVA_CLASS_MAGIC = 0xCAFEBABE;

    public static void main(String[] args)
    {
        try
        {
            DataInputStream dis = new DataInputStream(new FileInputStream("Test.class"));
            int magic = dis.readInt();
            if(magic == JAVA_CLASS_MAGIC)
            {
                int minorVersion = dis.readUnsignedShort();
                int majorVersion = dis.readUnsignedShort();

                /**
                 * majorVersion is ...
                 * J2SE 6.0 = 50 (0x32 hex),
                 * J2SE 5.0 = 49 (0x31 hex),
                 * JDK 1.4 = 48 (0x30 hex),
                 * JDK 1.3 = 47 (0x2F hex),
                 * JDK 1.2 = 46 (0x2E hex),
                 * JDK 1.1 = 45 (0x2D hex).
                 */

                System.out.println("ClassVersionTest.main() " + majorVersion + "." + minorVersion);
            }
            else
            {
                // not a class file
            }
        }
        catch (FileNotFoundException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
5
ответ дан 27 November 2019 в 05:24
поделиться

Если вы можете реорганизовать свой код, вы можете заключить свои вызовы в методы final / static в простые методы экземпляра, например:

protected Foo doBar(String name) {
    return Utility.doBar(name);
}

Это позволяет вам переопределить метод оболочки в модуле test, чтобы вернуть фиктивный экземпляр Foo.

В качестве альтернативы вы можете использовать Powermock , который расширяет Easymock (и Mockito), позволяя имитировать final и статические методы:

PowerMock - это среда, расширяющая другие макетные библиотеки, такие как EasyMock, с более мощными возможностями. PowerMock использует настраиваемый загрузчик классов и манипулирование байт-кодом, чтобы включить имитацию статических методов, конструкторов, конечных классов и методов, частных методов,

0
ответ дан 27 November 2019 в 05:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: