問題タブ [modelmapper]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
322 参照

java - cglib - OSGi でクラス プロキシを作成すると、NoClassDefFoundError が発生する

わかりました、これは皆さんにとってある種の理論的な質問です。

クラスのプロキシを作成して、cglib の Enchancer を試しています。私のコードは Felix OSGi コンテナーで実行されています。

階層は次のようになります。

OSGi の観点から見ると、2 つのバンドル (バンドル A とバンドル B) は完全に機能します。パッケージのインポート/エクスポートは bnd によって生成されます。BundleA は javax.xml.datatype パッケージを明示的にインポートしませんが、問題なく Child のインスタンスを作成できます。ここまでは順調ですね。

しかし、enchance() メソッドを呼び出して子プロキシを作成しようとすると、cglib は NoClassDefFoundError: javax.xml.datatype.XMLGregorianCalendar をスローします。

OK、わかりました - BundleB のクラスローダは確かにこのクラスをロードできません。実際 - cglib のエンチャンサは、プロキシを作成するために BundleB のクラスローダ (子のクラス タイプ クラスローダ) を使用しているようです。

一方、モジュール性を処理するために、OSGi コンテナーは、いわゆるクラスローディング委任を行っています。BundleB のクラスローダーの代わりに、OSGi ランタイムは、親クラス Parent のロードを、すべてのフィールドをロードする方法を知っている BundleA のクラスローダーに委任します。これが、BundleB が明示的に javax.xml.datatype パッケージをインポートする必要がなく、XMLGregorianCalendar クラスをロードする方法を知る必要がなく、引き続き Child オブジェクトを操作できる理由です。

私は疑問に思っていました-そのような「委任」アプローチはcglibのユースケースにも適していませんか? 私はバイトコード操作について何も知らないので、非常にばかげた質問のように聞こえるかもしれません。しかし、私は本当に理解していません - cglib が親のロードを親自身のクラスローダーに委譲できないのはなぜですか? そのようなメカニズムは cglib では本当に利用できないのでしょうか? なんで?cglib は OSGi と組み合わせて使用​​されていませんか? もしそうなら、なぜですか?