2011-07-07 8 views
1

私はEclipse Equinox 3.7および関連ライブラリの最新リリースをアプリケーションにアップグレードしています。私は、OSGi 4.3での一般的なサポートと新しいBundle.adapt()の概念の掘り起こしに興奮しています。私は一つのつまずきに遭遇しました。BundleWiringを使用してBundle/Class relatioshipsを検索するにはどうしたらいいですか?

以前は、PackageAdmin.getBundle(Class)を使用して、どのバンドルがどのクラスをロードしたかを調べました。私はいくつかのRMIオブジェクトの直列化の使用のためにこれを行う必要があります。

質問:新しいBundleWiring APIを使用して、ClassをBundleにマッピングするのと同じ結果を達成する方法はありますか?

私は、PackageAdminがおそらくすぐに外に出るのではないことを認識していますが、廃止予定の警告が嫌いです。

答えて

3

私はこの文書を見て初めてこれを見つけられなかったことに恥ずかしがりました。完全性のために私自身の質問に答える。コア仕様のPDFから

...

セクション3.9.9 - 検索オブジェクトのバンドル

バンドルがバンドルコンテキストへのアクセスがないコードで必要とされるシナリオがあります。この の理由で、フレームワークは以下のメソッドを提供します:

フレームワークUtil - getBundle(Class)メソッドを持つFrameworkUtilクラスを使用します。 フレームワークでは、このメソッドを使用して、 クラスローダーを取得する権限を持たずにコードでオブジェクトのバンドルを検索できます。クラスが のバンドルから発生していない場合、このメソッドはnullを返します。

クラスローダー - OSGiフレームワークは、 バンドルから来るクラスのクラスローダーがBundleReferenceインターフェースを実装するようにする必要があります。これにより、レガシーコードはオブジェクトの バンドルを見つけることができます。クラスローダーを取得し、BundleReferenceオブジェクトにキャストすると、 バンドルにアクセスできます。ただし、これには、コード loaderにアクセスするためのコードが必要です。次のコードは、任意のオブジェクトからBundleオブジェクトを取得する方法を示しています。

ClassLoader cl = target.getClassLoader(); 
if (cl instanceof BundleReference) { 
BundleReference ref = (BundleReference) cl; 
Bundle b = ref.getBundle(); 
... 
} 

OSGiシステムでは、すべてのオブジェクトがフレームワークに属しているわけではありません。したがって、ブートクラスパス loaderなど、BundleReferenceインターフェイスを実装していないクラスローダー を取得することができます。

+0

ありがとう、あなたは私に多くの仕事を保存しました:-) –