1

アプリケーションを Eclipse Equinox 3.7 および関連ライブラリの最新リリースにアップグレード中です。OSGi 4.3 で一般的なサポートが提供され、新しい Bundle.adapt() の概念を掘り下げることに興奮しています。私は一つのつまずきにぶつかりました。

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

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

おそらくすぐに PackageAdmin がなくなることはないと思いますが、非推奨の警告は嫌いです。

4

1 に答える 1

3

最初にドキュメントを調べたときにこれを見つけられなかったのはちょっと恥ずかしかった. 完全を期すために自分の質問に答えます。

コア仕様の PDF から ...

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

バンドル コンテキストにアクセスできないコードでバンドルが必要になるシナリオがあります。このため、フレームワークには次のメソッドが用意されています。

Framework Util – getBundle(Class) メソッドを使用して FrameworkUtil クラスを介して。フレームワークは、このメソッドを提供して、クラス ローダーを取得する権限がなくても、コードがオブジェクトのバンドルを検索できるようにします。クラスがバンドルに由来しない場合、メソッドは null を返します。

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

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

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

于 2011-07-07T17:42:55.133 に答える