使用java在运行时读取已编译的信息

时间:2014-03-03 09:55:25

标签: java

是否可以在运行时获取编译类的编译器信息(java版本和32位或64位)?我知道在命令行中可以使用jar文件,但是在运行时也可以吗?

我想在启动我的应用程序时使用这些信息创建一个日志条目。

由于 Hauke

3 个答案:

答案 0 :(得分:2)

这不是编译器的版本,而是字节代码 - 但可能有用:

您生成的每个 .class 文件包含版本标记:两个无符号短整数,从字节偏移量4开始,紧跟在0xCAFEBABE幻数之后。
它们是类格式的主要/次要版本号。

public class MyClass {
    public static void main(String[] args) throws IOException, URISyntaxException {
        String className = MyClass.class.getName();
        String classAsPath = className.replace('.', '/') + ".class";
        InputStream stream = MyClass.class.getClassLoader().getResourceAsStream(classAsPath);
        byte[] buffer = new byte[8];
        int r = stream.read(buffer);
        if (r < 8) {
            throw new IOException("Something wrong we could read only " + r + " bytes");
        }
        int major = buffer[6];
        int minor = buffer[7];
        int version = (major << 8);
        version = version | minor;
        System.out.printf("Version (major %X, minor %X) -> %X", major, minor, version);
    }
}

然后将字节码版本映射到JDK版本:

  • J2SE 7 = 51(0x33 hex)
  • J2SE 6.0 = 50(0x32 hex)
  • J2SE 5.0 = 49(0x31 hex)
  • JDK 1.4 = 48(0x30 hex)
  • JDK 1.3 = 47(0x2F十六进制)
  • JDK 1.2 = 46(0x2E hex)
  • JDK 1.1 = 45(0x2D hex)

答案 1 :(得分:1)

编译的类不是“32位或64位”。

字节码是相同的。

答案 2 :(得分:0)

您可以使用运行时保留创建自定义注释。例如,请检查以下内容:Java 1.5.0.12 and custom Annotations at Runtime