2014-11-17 2 views
0

У меня есть на основе Java RMI-сервер, в котором один из метода интерфейса, как это:Class.forName («FQN») бросает ClassNotFoundException Intermittently

public Properties process(String operation, Properties params) { 
     Class nodecls = Class.forName("com.example.commands." + operation); 
    } 

Этот метод прекрасно работает все время, но иногда (скажем, один раз в миллионах звонков RMI) бросает ClassNotFoundException. Что может быть причиной этого? Я уверен, что имя прошло правильно.

+0

Возможный родственный вопрос: http://stackoverflow.com/questions/11273353/java-rmi-and-classnotfoundexception – victorantunes

+0

Вы можете отправить код класса ** FQN **? возможно, класс, недоступный из вашего объема. Это знак с публикой? или какой-либо другой модификатор? – ymz

ответ

3

От XYZWS - What does Class forname method do?:

Вызов Class.forName("X") вызывает класс с именем X динамически загружен (во время выполнения). Вызов forName («X») вызывает инициализацию класса с именем X (т. Е. JVM выполняет весь свой статический блок после загрузки класса). Class.forName("X") возвращает объект Class, связанный с классом «X». Возвращаемый объект Class не является экземпляром самого класса «x».

Class.forName("X") загружает класс, если он еще не загружен. JVM отслеживает все ранее загруженные классы. Этот метод использует вызывающий его класс classloader. «X» - это полное имя желаемого класса.

The tag wiki for имеет более простое описание:

Исключение Java генерируется, когда приложение пытается загрузить класс по имени. Обычно поднятый одним из:

  • метод forName в классе класса [...]

когда нет определения для класса с указанным именем не может быть найден в пути к классам.

Таким образом, может быть только две причины для этого:

  1. Класс имени "com.example.commands." + operation нет на пути к классам.
  2. ClassLoader of Class который ваш метод в том, что вы не можете найти "com.example.commands." + operation класс. Возможно, какой-то трюк с отражением сломал его.

Однако, вы никогда не должны возиться с этим, как ваш метод не будет даже компиляции - это из не- типа void возвращения, в то время как вы никогда не включали надлежащего return заявление.

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