私たちはRCP 3/4ハイブリッドアプリケーションとfragment.e4xmiで定義されたハンドラを持っています。Eclipse RCP、ハンドラはいつ作成されますか?
<fragments xsi:type="fragment:StringModelFragment" xmi:id="_X7-AID93EeKXHI5xGhqnKg" featurename="handlers" parentElementId="org.eclipse.[..].application">
<elements xsi:type="commands:Handler" [..]/>
<elements xsi:type="commands:Handler" xmi:id="_jx8voD93EeKXHI5xGhqnKg" elementId="[..].ui.handler.addToDatabase" contributionURI="bundleclass://[..].ui/[..].ui.handlers.AddToDatabaseHandler" command="_TlV-ID93EeKXHI5xGhqnKg"/>
<elements xsi:type="commands:Handler" [..]/>
public class AddToDatabaseHandler implements EventHandler {
private ISelectionMSD selection;
public AddToDatabaseHandler() {
System.err.println("Created " + this);
}
@Execute
public void execute(@Named(IServiceConstants.ACTIVE_PART) MPart part) {
System.err.println(this + ": Execute, selection is " + selection);
if(selection != null) {
// do something
}
}
@Override
public void handleEvent(Event event) {
if(event.getTopic().equals(UPDATE_SELECTION)) {
selection = (ISelectionMSD)event.getProperty(IEvents.PROPERTY_SELECTION);
System.err.println(this + ": Handle event, selection is " + selection);
}
}
}
私はいくつかをSystem.errを添加し、私はこのハンドラの2つのインスタンスは、DI /反射を介して暗黙的に作成されていることを見ることができます。
1)このハンドラのインスタンスを作成すると簡単な説明はありますか?
2)最初に作成されたインスタンス(プラットフォームの起動時)は、このクラスがリッスンしているイベントをミスします。したがって、イベントリスナーとしてEventAdminに追加されていないようです。何とかこれをデバッグできますか?
3)それは私にとって「魔法」のように思えます。いつ、どこで、どのようにイベントを聞くために登録された2番目のクラスですか?これはプラットフォームによってどこかで行われるのですか、私は自分のコードをいくつか見逃していますか?
多くのお手伝いをありがとうございます!
多くの感謝を使用!私は、どのように、なぜ、なぜ、注釈付きメソッドを使用するのか、両方のオブジェクトでイベントが適切に処理されているかどうかはわかりません。私はまだ2つのインスタンスが作成されている理由は分かっていませんが、最も重要なのは一貫しています) "ハイブリッド"の場合は、fragment.4xmiとplugin.xmlと拡張ポイントを使用します。 – kerner1000
ハンドラが複数回作成される理由はいくつかあります。たとえば、ハンドラがあるパーツに対して定義されている場合、そのパーツが作成されるたびに作成されます。 –
問題が解決しました。また、ハンドラクラスはxmlを介してOSGiサービス(EventHandler)として登録されていました。私は提案された注釈を使用してそれをリファクタリングし、期待どおりに機能するOSGiサービス定義を削除しました。どうもありがとう! – kerner1000