0

これは実世界の例から来ています。一部の Hibernate クラスは Antlr クラスをサブクラス化し、いくつかのフィールドにデータを入力しようとしますが、これは最近の Antlr バージョンでのみ導入されました。

HibernateClass ---subclasses---> AntlrClass
HibernateClass uses AntlrClass.fieldX

誰かが実行時に古い Antlr ライブラリをデプロイすると、このスーパークラス フィールドは存在せず、 aNoSuchFieldErrorがスローされます。

実行時に動的にバインドするスーパークラスが互換性のあるバージョンであることを確認するための標準的な Java/JVM の方法は何ですか?

4

2 に答える 2

1

これをチェックしてください -

パッケージcom.mobile.mail;

 import java.io.IOException;
import java.util.Map;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
 import java.util.jar.Manifest;

public class Test {

/**
 * @param args
 */
public static void main(String[] args) {
    Map<String,Attributes> map = null;
    try {
        JarFile file = new JarFile("Your library file path");
        Manifest manifest = file.getManifest();
        System.out.println(manifest.getMainAttributes().getValue("Specification-Version"));
        System.out.println(manifest.getMainAttributes().getValue("Implementation-Version"));
        map = manifest.getEntries();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

まず、チェックする必要がある各 jar ファイルのファイル バージョンを確認する必要があります。古いバージョンが見つかった場合は、単にエラー メッセージが表示されます。

于 2012-05-21T11:20:57.797 に答える
0

それでは、私なりの答えを出しましょう。

Java は、コンパイル時のスーパー クラスが実行時のスーパー クラスと一致する/互換性があるかどうかを実行時に判断するようには設計されていません。Java は構築と実行に別々のクラス パスを使用し、サブクラスはスーパークラスからコンテンツを複製しないため、NoSuchFieldErrors が予想されます。

Java は、そのままではこれを処理しません。

于 2012-05-25T06:31:09.237 に答える