2012-05-21 66 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