0

这来自一个真实世界的例子,一些 Hibernate 类继承了 Antlr 类并尝试填充一些字段,这仅在最近的 Antlr 版本中引入。

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

如果有人在运行时部署了较旧的 Antlr 库,则该超类字段将不存在,并且NoSuchFieldError会抛出 a。

确保在运行时动态绑定到的超类是兼容版本的标准 Java/JVM 方法是什么?

4

2 回答 2

1

看一下这个 -

包 com.mobilous.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 回答