这来自一个真实世界的例子,一些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不会开箱即用地处理这个问题。