是否有任何的Java API来找出JDK版本类文件编译为? 当然,是要找出主要的版本中提到的javap的工具在这里 。 不过,我想这样做编程,这样我可以提醒用户及时编译为适当的JDK
Answer 1:
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
Answer 2:
basszero的做法可以通过UNIX命令行完成,而“OD(1)”的命令:
% od -x HelloWorldJava.class |head -2
0000000 feca beba 0000 3100 dc00 0007 0102 2a00
0000020 6f63 2f6d 6e65 6564 6163 642f 6d65 2f6f
“FECA贝巴”是神奇的数字 。 的 “0000 3100” 是0X31,其表示J2SE 5.0。
Answer 3:
这可以让你的类文件的内容:
MysteryClass.class.getResourceAsStream("MysteryClass.class")
然后看字节5-8获得主要和次要版本。 这些数字和JDK版本之间的映射,可以发现在这里 。
Answer 4:
Apache的BCEL提供这个API:
JavaClass c = Repository.lookupClass("com.x.MyClass")
c.getMinor();
c.getMajor();
Answer 5:
只需直接读取类文件。 这是很容易弄清楚的版本。 退房的规范和维基 ,然后尝试代码。 结束语此代码,并制定更加有用/漂亮留作练习。 另外,您也可以使用这样一个库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();
}
}
}
Answer 6:
在Linux上,你可以使用file
上的类文件,我发现最简单的我用例的命令。 例如:
$ file Foo.class
Foo.class: compiled Java class data, version 50.0 (Java 1.6)
Answer 7:
正如其他人已经表明,它是很容易读出第1 8个字节的类文件做。 如果你想有一个预编译的二进制库,你可以下载一个在这里 。
Answer 8:
javap的确实有一个API ,但它是特定于Sun JDK。
它在发现tools.jar
,在sun/tools/javap/Main.class
。
文章来源: Java API to find out the JDK version a class file is compiled for?