Matlab не видит изменений в классе Java при перекомпиляции

1

Я работаю с Matlab и пытаюсь запустить из него Java-класс. Поэтому я добавляю путь класса java к classpath.txt в Matlab. Затем я создаю объект класса java HelloWorld и он отлично работает:

o = HelloWorld;
javaMethod('main', o);

Однако, когда я изменяю код в Helloworld, Matlab этого не видит: мне нужно перезапустить Matlab для работы с измененным кодом Helloworld.

Есть ли способ заставить Matlab видеть изменения в Helloworld без перезапуска?

Теги:
class
matlab-java

1 ответ

2
Лучший ответ

Я думаю, вы пробовали clear classes Matlab без успеха

Если я возьму его от Яира Альтмана "Недокументированные секреты программирования MATLAB-Java":

Если вы не изменили подпись класса java, вы можете уйти с ней:

Java-классы не перезагружаются автоматически Matlab при перекомпиляции вне Matlab. для перезагрузки модифицированного Java-класса нам необходимо перезапустить JVM, перезапустив Matlab. Для классов, помещенных в динамический путь к классам, вы можете попробовать команду Matlabs clear('java), помня о ее побочном эффекте очистки всех глобальных переменных. Однако это не всегда работает (например, если подпись класса изменилась).

По-видимому, если вы чувствуете себя экспертом по Java-программисту, есть потенциальные обходные пути:

Экспертные Java-программисты могут попытаться использовать предложение Пола Миленковича для прокси-загрузчика классов в качестве альтернативы перезапуску Matlab или очистке Java. как объясняет Дэн Спилман, "основная идея заключается в том, что вы создаете загрузчик классов для своего класса, а затем получаете доступ к нему через загрузчик классов. После перекомпиляции вы уничтожаете загрузчик классов и затем создаете новый экземпляр, который затем читает перекомпилированный класс ".

Но нижняя строка:

На практике я предлагаю перезапустить Matlab после повторной компиляции классов Java, даже если это не является абсолютно необходимым. Это может сэкономить массу разочарований в отладке и преследовании ошибок, которые происходят только потому, что Matlabkeeps использует старый класс в памяти.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню