2012-05-21 59 views
0

这来自一个真实世界的例子,一些Hibernate类继承了Antlr类,并尝试填充一些只在最近的Antlr版本中引入的字段。确保运行时Java超类正确

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

如果有人在运行时部署一个较旧的ANTLR的图书馆,这个超字段将不存在,一个NoSuchFieldError将被抛出。

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

+0

那么,当使用错误的类版本时,你希望**发生什么?我认真地怀疑你可以做得比抛出一个错误好得多。在抛出错误时,最多你可以影响*(将第一次访问放在静态初始化块中,并且在加载类时确保它发生)。 –

+0

您想在应用初始化时发现错误,例如“不兼容JAR”或什么的。您可能正在寻找特定的版本范围。您可能需要相应地调整您的代码。 – Nick

回答

0

我就会放弃我自己的答案,然后 -

Java是没有经过设计的运行时间来确定编译时的超类是否匹配/与运行时的超类兼容。由于Java使用单独的类路径进行构建和运行,并且由于子类不会从超类复制内容,所以期望NoSuchFieldErrors。

Java不处理这个开箱即用。

1

查看结果 -

package 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(); 
    } 
} 

}

现在你应该首先检查你需要check.if发现旧的每个jar文件的文件版本只是显示错误信息。

+0

使用工具并不是我正在寻找的东西 - 我正在寻找一种根据Java(语言和JVM)所期望的一般“正确”方法。 – Nick

+1

+1努力... – Nick