有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

继承确保运行时Java超类是正确的

这来自一个真实的例子,一些Hibernate类将一个Antlr类划分为子类,并尝试填充一些字段,这只是在最近的Antlr版本中引入的

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

如果有人在运行时部署了一个旧的Antlr库,那么这个超类字段将不存在,并且将抛出一个NoSuchFieldError

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


共 (2) 个答案

  1. # 1 楼答案

    看看这个-

    包裹通讯。机动的。邮寄

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

  2. # 2 楼答案

    那我就自己回答吧

    Java的设计目的不是在运行时确定编译时超类是否与运行时超类匹配/兼容。由于Java在构建和运行时使用不同的类路径,并且子类不复制超类中的内容,因此不需要出现任何uchfield错误

    Java并不是开箱即用的