Я работаю с Matlab и пытаюсь запустить из него Java-класс. Поэтому я добавляю путь класса java к classpath.txt
в Matlab. Затем я создаю объект класса java HelloWorld
и он отлично работает:
o = HelloWorld;
javaMethod('main', o);
Однако, когда я изменяю код в Helloworld
, Matlab этого не видит: мне нужно перезапустить Matlab для работы с измененным кодом Helloworld
.
Есть ли способ заставить Matlab видеть изменения в Helloworld
без перезапуска?
Я думаю, вы пробовали clear classes
Matlab без успеха
Если я возьму его от Яира Альтмана "Недокументированные секреты программирования MATLAB-Java":
Если вы не изменили подпись класса java, вы можете уйти с ней:
Java-классы не перезагружаются автоматически Matlab при перекомпиляции вне Matlab. для перезагрузки модифицированного Java-класса нам необходимо перезапустить JVM, перезапустив Matlab. Для классов, помещенных в динамический путь к классам, вы можете попробовать команду Matlabs
clear('java)
, помня о ее побочном эффекте очистки всех глобальных переменных. Однако это не всегда работает (например, если подпись класса изменилась).
По-видимому, если вы чувствуете себя экспертом по Java-программисту, есть потенциальные обходные пути:
Экспертные Java-программисты могут попытаться использовать предложение Пола Миленковича для прокси-загрузчика классов в качестве альтернативы перезапуску Matlab или очистке Java. как объясняет Дэн Спилман, "основная идея заключается в том, что вы создаете загрузчик классов для своего класса, а затем получаете доступ к нему через загрузчик классов. После перекомпиляции вы уничтожаете загрузчик классов и затем создаете новый экземпляр, который затем читает перекомпилированный класс ".
Но нижняя строка:
На практике я предлагаю перезапустить Matlab после повторной компиляции классов Java, даже если это не является абсолютно необходимым. Это может сэкономить массу разочарований в отладке и преследовании ошибок, которые происходят только потому, что Matlabkeeps использует старый класс в памяти.