是否可以在运行时获取编译类的编译器信息(java版本和32位或64位)?我知道在命令行中可以使用jar文件,但是在运行时也可以吗?
我想在启动我的应用程序时使用这些信息创建一个日志条目。
由于 Hauke
答案 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版本:
答案 1 :(得分:1)
编译的类不是“32位或64位”。
字节码是相同的。
答案 2 :(得分:0)
您可以使用运行时保留创建自定义注释。例如,请检查以下内容:Java 1.5.0.12 and custom Annotations at Runtime