java 编译器获得型号_关于编译器构造:如何找到已编译类的目标Java版本?
重復:
Tool to read and display Java .class versions
如果我有一個已編譯的Java類,是否可以僅從類文件中得知其目標版本兼容性是什么? 具體來說,我有許多編譯為Java 6的類文件,它們在Java 5下運行,并顯示"無法識別的版本"錯誤。 我希望能夠在不運行JVM的情況下查看類文件并查找其目標版本兼容性。 有任何想法嗎?
...,當然,如果您愿意使用終端,文件實用程序也將包含在MacOS中。
您可以使用標準JDK隨附的javap實用程序。
javap -verbose MyClass
Compiled from"MyClass.java"
public class MyClass extends java.lang.Object
SourceFile:"MyClass.java"
minor version: 3
major version: 45
盡管它可能被認為是"更好"的,但這并不是我一直在尋找的東西。
使用文件程序(在大多數GNU / unix系統上)可以實現相同的結果:文件Foo.class Foo.class:編譯的Java類數據,版本45.3 BTW:如何編譯以產生此輸出(45.3),即.45 jdk1。 x或j2me?
在Wikipedia上有關Java類文件的文章中,有一個主版本號表(例如主版本51 = Java 1.7等)。
可以使用" javap -version target.class"轉儲確切的版本
我已經在網上找到了它并且可以使用。
Every '.class' file starts off with
the following:
Magic Number [4 bytes]
Version Information [4 bytes]
A hexdump of a '.class' file compiled
with each of the following options
reveals:
javac -target 1.1 ==> CA FE BA BE 00 03 00 2D
javac -target 1.2 ==> CA FE BA BE 00 00 00 2E
javac -target 1.3 ==> CA FE BA BE 00 00 00 2F
javac -target 1.4 ==> CA FE BA BE 00 00 00 30
Perhaps you could use this information
to write your own '.class' file
version checking utility, using Java,
or perhaps a scripting or shell
language ;) !
I hope this helps.
Anthony Borla
來自:http://bytes.com/groups/java/16603-how-determine-java-bytecode-version
太好了,但是我關心的1.5和1.6版本呢?
好像最后一個數字代表最終版本,十六進制31 = dec 49十六進制32 = dec50。那就是我所需要的。 謝謝。
版本1.6 = 32,而1.5為31
我發現這里提供的答案更具啟發性。
javap -verbose MyClass =>主要版本49(十進制)= Java 1.5,50 = Java 1.6,51 = Java 1.7,52 = Java 1.8。
Linux / Unix用戶在標準工具箱中有一個不錯的工具:file實用程序。 現代版本可以檢測Java類fersion版本,甚至可以輸出已知類文件類型的Java版本。
輸出示例:
com/sample/Tracker.class: compiled Java class data, version 45.3
com/sample/TestListener.class: compiled Java class data, version 49.0 (Java 1.5)
它非常適合標準Unix腳本工具鏈。
摘自:http://twit88.com/blog/2008/09/22/java-check-class-version/
try {
String filename ="C:\\MyClass.class";
DataInputStream in = new DataInputStream(new FileInputStream(filename));
int magic = in.readInt();
if (magic != 0xcafebabe) {
log.info(filename +" is not a valid class!");
}
int minor = in.readUnsignedShort();
int major = in.readUnsignedShort();
log.info(filename +":" + major +" ." + minor);
in.close();
} catch (IOException e) {
log.info("Exception:" + e.getMessage(), e);
}
您可以查看文件中的字節偏移6和7(可能在十六進制轉儲中),它告訴您使用哪個版本。 我認為Bytecode Visualizer(eclipse插件)可以查看為類文件創建的版本。
進一步閱讀
總結
以上是生活随笔為你收集整理的java 编译器获得型号_关于编译器构造:如何找到已编译类的目标Java版本?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 临时索引_MySQL sel
- 下一篇: java消息幂等性实现_探讨一下实现幂等