1

プログラムでOSGiフレームワークを作成し、それを使用してバンドルをロードし、そのバンドルからクラスをロードしたいと思います。電話Bundle.loadClass()をかけるClassと、すべてのfields \ methods\constructorフィールドがnullに設定されたインスタンスが表示されます。名前しかありません。パブリックメソッドなどにアクセスできません。EquinoxとFelixの両方を試しましたが、同じ結果になりました。

バンドルMANIFEST

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Activator: org.osgitest.osgitest.Activator
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-Name: OSGi Test
Bundle-SymbolicName: org.osgitest.osgitest
Bundle-Version: 1.0
Import-Package: org.osgi.framework
Export-Package: org.osgitest.osgitest.test

フレームワークのセットアップ:

FrameworkFactory ff = new EquinoxFactory();
Map<String, String> config = new HashMap<String, String>(1);
config.put("org.osgi.framework.storage.clean", "onFirstInit");
Framework framework = ff.newFramework(config);
framework.init();
framework.start();

FrameworkFactory ff = new org.apache.felix.framework.FrameworkFactory();
Map<String, String> config = new HashMap<String, String>(1);
config.put("org.osgi.framework.storage.clean", "onFirstInit");
Framework framework = ff.newFramework(config);
framework.init();
framework.start();

バンドルの読み込み:

Bundle testBundle = framework.getBundleContext().installBundle("file:C:\\org-osgitest-osgitest.jar");
testBundle.start();
Class<?> classOne = testBundle.loadClass("org.osgitest.osgitest.test.ClassOne");
Class<?> activator = testBundle.loadClass("org.osgitest.osgitest.Activator");

ActivatorClassインスタンスにはコンストラクター参照が含まれていますが、パブリックメソッドは含まれていません。ありpublic void start(BundleContext c)ますpublic void stop(BundleContext c)

どうすれば正しいものをロードできますClassか?私は何が間違っているのですか?助けてくれてありがとう。

4

2 に答える 2

1

Classある種の遅延初期化を使用します。Classインスタンスは、etcの実行後にのみメソッド/フィールドで埋められますgetMethods。これが、デバッガーで何も表示されなかった理由です。

呼び出しようpublic static void main(String[] args)としましたが、にキャストしませんでしString[]Object。そのため、次のように解釈さObject[]れ、JVMは署名付きのメソッドを探しました(args[0].class, args[1].class, ... , args[n].class)。これが私のメソッドが見つからなかった理由です。

于 2011-11-02T08:37:10.423 に答える
0

バンドルはjarであるため、通常のクラスパスモードでクラスをロードしようとしましたか?OSGiはクラスローダーを定義するだけです。VMは、バイトコードからクラスオブジェクトを作成する責任があります。そのため、OSGiフレームワークがClassオブジェクトからメンバーを「取り除く」方法がわかりません。

于 2011-10-12T18:20:25.460 に答える