クラスファイルがコンパイルされるJDKのバージョンを調べるJava APIはありますか?もちろん、hereで言及されているメジャーバージョンを見つけるためのjavapツールがあります。しかし、私はそれをプログラム的に実行して、適切なJDKのためにコンパイルするよう警告することができます。クラスファイルがコンパイルされているJDKのバージョンを調べるJava API?
答えて
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
JavaPにはAPIがありますが、それはSun JDK固有のものです。
tools.jar
のsun/tools/javap/Main.class
にあります。
これはあなたのクラスファイルの内容を取得します:
MysteryClass.class.getResourceAsStream("MysteryClass.class")
その後、マイナーを取得するために、バイト5-8を見て、メジャーバージョン。それらの番号とJDKリリースとのマッピングはhereです。
文字列引数を完全修飾する必要がありますか? getResourceAsStream( "org/apache/foobar/Whatever.class")? –
いいえ、リソースを取得するための基礎としてクラス自体を使用しているためです。クラスの代わりにClassLoaderのgetResourceメソッドを使用できる場合は、完全修飾名が必要です。 –
クラスファイルを直接読み込んでください。それは非常にバージョンを把握するのは簡単です。 specとwikiを確認してから、コードを試してください。このコードをラップして作ることは、より便利です/かなり練習として残っています。他の人が示したように別の方法として、あなたは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();
}
}
}
これは、jarファイル内のクラスファイルに対して機能しますか? –
のようなライブラリを使用することができ、クラスファイルの最初の8つのバイトを読み込むことで行うのに十分に簡単です。あらかじめ構築されたバイナリライブラリが必要な場合は、hereをダウンロードできます。
Apache BCELは、このAPIを提供します:
JavaClass c = Repository.lookupClass("com.x.MyClass")
c.getMinor();
c.getMajor();
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のBEBAは" magic number。 「0000 3100」は、J2SE 5.0を表す0x31です。
Linuxでは、クラスファイルでfile
コマンドを使用することができます。これは私の使用例で最も簡単なものです。例:
$ file Foo.class
Foo.class: compiled Java class data, version 50.0 (Java 1.6)
- 1. JDK 1.8でコンパイルするjava:クラスファイルにアクセスできない...クラスファイルが見つかりません
- 2. Java:上位バージョンのJDKを使用してコンパイルするときに高バージョンのJDKを使用しないで低バージョンで実行する場合
- 3. レジストリからインストールされているプログラムのバージョンを調べる
- 4. インストールされているmod_perlのバージョンを調べるには?
- 5. JavaソースからコンパイルされたJavaクラスファイルをロードしないでください。
- 6. コンパイラがJava 6をコンパイルする方法Java 6をコンパイルするJavaクラスファイルをコンパイルする
- 7. RHEL7のJava 8(JDK)バージョン
- 8. jdkバイナリでJavaクラスファイルを実行するには?
- 9. Java JDKのバージョンとSDKのバージョンを確認する方法は?
- 10. Javaタイマがキャンセルされているかどうかを調べる
- 11. JavaコンパイラのAPI - 外部クラスファイル
- 12. インストールされているファブリックAPIのバージョン
- 13. javaでのバージョンの最大値を調べるロジック
- 14. どのコントロールがシリアル化されているかを調べる
- 15. JDK 8でコンパイルされているが、JRE 7をターゲットにしているConcurrentHashMapアプリケーションがクラッシュする
- 16. intellijにインポートされたjdkクラスファイルの内容を表示する方法
- 17. TransactionScopeがコミットされているかどうかを調べる
- 18. シャットダウン-sが実行されているときを調べる
- 19. ファイルが保存されているパスを調べる
- 20. IEがインストールされているWindowsレジストリを調べるには?
- 21. JDKがインストールされていないJava 7トリガ・ヒープ・ダンプ
- 22. (クラスファイルのバージョンが1.2である)
- 23. 2 jdk特定のJavaバージョンをsonarqube-4.5.7に設定してください。
- 24. コードのasp.netバージョンを調べるには?
- 25. jarファイルのバージョンを調べる
- 26. PyJWTのバージョンを調べる方法は?
- 27. JDK-1.4でコンパイルされたSPecJVM2008
- 28. PhpStormがどのGitバージョンを使用しているのか調べるには?
- 29. JDKがインストールされていないAndroidエミュレータのバージョンはありますか?
- 30. ASM ClassReaderがクラスファイルを解析できませんでした - おそらく新しいJavaクラスファイルのバージョンがサポートされていないためです - Apache 7とJDK 1.8を使用しています
ファイルからバイトを読み取るのに必要な答えは、私にはあまりにも文句がないようです。 Foobar.class.getTargetVersion()など、Reflectionを使用してこの情報を取得する方法があります。 –