我试图更全面地了解在Matlab中将侦听器添加到java对象时发生的事情。有关原始讨论,请参阅here。
下面是一个用于设置回调的java src
public class Handler {
public Listener object;
public class Event extends java.util.EventObject {
public double d1,d2,d3;
Event(Object obj, double d1, double d2, double d3) {
super(obj); this.d1 = d1; this.d2 = d2; this.d3 = d3;
}}
public interface Listener extends java.util.EventListener {
// the function call matlab proxy obj implements
void measurement(Event event);
}
public void addListener (Listener listener) {
System.out.println("listener has been added");
this.object = listener;
}
public void removeListener(Listener listener) {
System.out.println("listener has been removed");
this.object = null;
}
// wrapper function (i.e. what actually exposed/called/used)
public void measurement(double temp, double pressure, double height) {
this.object.measurement( new Event(this, temp, pressure, height) );
System.out.println("listener has been notified");
}
}
然后在Matlab(2014b)中可以设置Java - > Matlab回调为
% create Handler java object in matlab
handler = com.callback.Handler();
% add a listener for interface function measurement(e)
addlistener(handler,'measurement',@(h,e)disp(e.d1+e.d2+e.d3));
% call the wrapper function manually to test setup
handler.measurement(1,2,3);
Matlab的addlistener
调用初始设置的一些想法由
/toolbox/matlab/uitools/private/javaaddlistener.m
在Matlab中调用addlistener
时,我在命令窗口中收到消息
已添加侦听器
来自addListener
中的Handler
函数。所以这里Matlab动态创建了一个实现Listener
接口并调用
handler.addListener(mysteryObj);
我可以试着看看Matlab在那里放了什么
>> handler.object
返回
com.mathworks.MLEventAdapters.com.callback.Handler$ListenerLIAdapterClass@45a37759
我猜是某种动态创建的proxy对象?
这里最令人烦恼的问题是,一旦我突然看到>> handler.object
,我就会看到消息
侦听器已被删除
但为什么?这意味着Matlab会自动调用
handler.removeListener(mysteryObj)
这里吗?
无论如何,我开始浏览com.mathworks.jmi,但这需要一段时间,我甚至不确定答案是否存在......任何帮助都会很棒。