确保运行时 Java 超类正确



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

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

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

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

看看这个 -

包裹通信.移动邮件;

 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文件的文件版本。如果发现较旧,只需显示错误消息。

那我就给出我自己的答案——

Java 不是为了在运行时确定编译时超类是否与运行时超类匹配/兼容而设计的。由于Java使用单独的类路径进行构建和运行,并且由于子类不会从超类复制内容,因此预计会出现NoSuchFieldErrors。

Java不会开箱即用地处理这个问题。

最新更新