5

デプロイメント プラットフォームが Java 5 で、Java 6 の Eclipse で開発が行われている状況があり、特定のプロジェクトで作業を開始するときに新しいワークスペースを作成する手順を確立しました。したがって、必要な手順の 1 つはコンパイラ レベルを Java 5 に設定することですが、これは忘れがちです。

開発プラットフォームを実行するテスト マシンがあり、ビルドしたコードを実行して PC 上で初期テストを行うことができますが、コンパイラ レベルを切り替えるのを忘れると、プログラムを実行できません。顧客に提供するものを作成するためのビルド サーバーがありますが、これはうまく機能しますが、これはビルド サーバーが不要な開発用であり、不要な待機が追加されます。

問題は 、現在のクラスのバイト コード バージョンをプログラムで判別できるので、ローカル PC でのテスト中にコードが警告を出力できるかどうかです


編集:要件は現在のクラスに対するものであることに注意してください。これはクラスローダから利用できますか? それとも、現在のクラスのクラス ファイルを見つけて調査する必要がありますか?

4

5 に答える 5

15

これを見つけてクラスでjavapを実行する簡単な方法

詳細については、http: //download.oracle.com/javase/1,5.0/docs/tooldocs/windows/javap.html にアクセスしてください。

例:

M:\Projects\Project-1\ant\javap -classpath M:\Projects\Project-1\build\WEB-INF\classes -verbose com.company.action.BaseAction

次の行を探します

minor version: 0
major version: 50
于 2011-11-01T18:11:42.247 に答える
7

クラス ファイルをリソースとしてロードし、最初の 8 バイトを解析できます。

//TODO: error handling, stream closing, etc.
InputStream in = getClass().getClassLoader().getResourceAsStream(
    getClass().getName().replace('.', '/') + ".class");
DataInputStream data = new DataInputStream(in);
int magic = data.readInt();
if (magic != 0xCAFEBABE) {
  throw new IOException("Invalid Java class");
}
int minor = 0xFFFF & data.readShort();
int major = 0xFFFF & data.readShort();
System.out.println(major + "." + minor);
于 2009-11-10T11:11:30.753 に答える
3

Java クラス ファイル形式記述子は次のとおりです。 Java クラス ファイル形式

ここにメジャーバージョンの値があります:

public static final int JDK14_MAJOR_VERSION = 48;

public static final int JDK15_MAJOR_VERSION = 49;

public static final int JDK16_MAJOR_VERSION = 50;

ここで、Java コードを含むクラス ファイルを読み取り、メジャー バージョンをチェックして、どの JVM がそれを生成したかを確認します。

于 2009-11-10T11:12:00.833 に答える
3

質問を見てください: Java API to find the JDK version a class file iscompiled?

于 2009-11-10T11:12:05.817 に答える
2

クラスファイルコンテンツのバイト5から8は、16進数のバージョン番号です。Javaコード(または他の言語)を使用して、バージョン番号を解析できます。

于 2009-11-10T11:10:36.193 に答える