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