2012-05-21 2 views
0

Это пример из реального мира, некоторые классы класса Hibernate представляют класс Antlr и пытаются заполнить какое-то поле, которое было введено только в последней версии Antlr.Убедитесь, что суперкласс суперсовременного исполнения верен

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

Если кто-то разворачивает во время выполнения старой библиотеки Antlr, это суперкласс поле не будет существовать и NoSuchFieldError будет выброшен.

Что такое стандартный способ Java/JVM, чтобы убедиться, что суперкласс, который вы динамически связываете во время выполнения, является совместимой версией?

+0

Ну, что вы ** хотите ** произойти, когда используется неправильная версия класса? Я серьезно сомневаюсь, что вы могли бы сделать гораздо лучше, чем ошибка. В лучшем случае вы можете влиять на *, когда * возникает ошибка (поместите первый доступ в статический блок инициализатора, и вы убедитесь, что это произойдет, когда класс загружен). –

+0

Вы хотите поймать ошибку, когда приложение инициализируется, например. «несовместимый JAR» или что-то в этом роде. Возможно, вы ищете определенный диапазон версий классов. Возможно, вы захотите соответствующим образом адаптировать свой код. – Nick

ответ

0

Я просто дать свой ответ тогда -

Java не был разработан, чтобы определить время выполнения ли времени компиляции матчи супер класс/совместим с вводного времени суперкласса. Поскольку Java использует отдельные пути класса для построения против работы, а так как подклассы не реплицируют содержимое из суперкласса, ожидаются NoSuchFieldErrors.

Java не справляется с этим из коробки.

1

Проверьте это -

пакет 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 нашли старший просто выводит сообщение об ошибке.

+0

Использование инструментов - это не совсем то, что я ищу - я ищу общий «правильный» способ сделать это в соответствии с тем, что ожидает Java (язык и JVM). – Nick

+1

+1 для усилий ... – Nick

Смежные вопросы