我有一些从SWT Composite派生的类的实例。
这些实例被注入ContextInjectionFactory。该类的一个示例是:

public class MyTest extends Composite {
    public MyTest(Composite parent, int style) {
        super(parent, style);
    }

    @Inject
    @Optional
    private void doSomething(@UIEventTopic(EventConstants.TEST) Object unused) {
        //do something
    }
}


这就是我的用法:

public createTestContent() {
    MyTest myTest = new MyTest(composite, SWT.NONE);
    ContextInjectionFactory.inject(myTest, context);
}

public someAction() {
    composite.dispose();
}


如果现在(通过处置其父项)处置这些对象,我希望示例代码中的doSomething方法不再被调用。但是实际上它仍然会被调用。

为了阻止此行为,我需要致电

ContextInjectionFactory.uninject(myTest, context);


有人知道为什么会这样吗?

最佳答案

当您使用@UIEventTopic时,Eclipse必须记住该方法,以便在事件发生时可以调用该方法。 Eclipse会继续记住并调用此方法,直到您在类实例上运行ContextInjectionFactory.uninject为止。

这与处理SWT控件无关-只是释放控件正在使用的所有本机数据。

看起来与ExtendedObjectSupplier进行处理的@UIEventTopic使用WeakReference来记住方法信息,因此有时在内存不足时可能会丢弃数据。

10-08 18:53