0

現在取り組んでいるプラットフォーム (JDK 1.3、BD-J) にはかなり制限があります。私が使用したい 1 つの JAR ファイルは、ロード時に自己整合性チェックを実行しようとし、失敗すると操作不能状態になります。なぜこれが起こっているのかを突き止めるのは非常に困難ですが、ほとんどの情報源は、BD-J 構造を介して自分自身を見つけたりアクセスしたりできないため、死ぬことを指摘しています。

これは、ロード時にそれを使用することを除外し、代わりにアプリケーション自体にロードします。これは非常に大きなライブラリなので、ロードされたオブジェクトをそれにキャストして潜在的に使用できるように、かなりの量のインターフェイスを作成する必要があります。ここに私の問題があります。

インターフェースは通常のロード時にロードされ、ライブラリは実行時にロードされ、以前にロードされたインターフェースにキャストされますが、これは問題ですか? ClassCastException を受け取っています

できる限りライブラリのパブリック メソッドに基づいてインターフェイスを作成しましたが、インターフェイスにキャストしようとすると、ClassCastException が発生します。注: すべて正常にロードされ、コンストラクターにアクセスしてメソッド名を読み取ることができます。使用可能にするためにキャストすると、失敗します。

私のプロジェクトとツールキットのインターフェイス パッケージは異なりますが、これは問題ですか?

アイデアが不足しています。見落としているものはありますか?

ありがとう。

4

2 に答える 2

0

あなたの問題が何であるかを完全に理解しているかどうかはわかりません-おそらく、クラス階層がどのように見えるかについての詳細が、状況を理解するのに役立つでしょう. あなたが書いたことから、2つの可能なシナリオを推測できます。

.1. 使用したいクラスはインターフェースを実装していません。

この場合、インターフェースの名前に関係なく、ロードしているクラスがそれらを実装していないため、機能しません。その jar をブート クラスパスの一部としてロードできない場合は、リフレクションの使用に固執しています。

.2. 必要なクラスは、複製しようとしているインターフェイスを実装します。

この場合、インターフェイスの実装は、クラスが実装しているインターフェイスの正確な修飾名と一致する必要があります。通常、jar からクラスをロードする場合、クラス ローダーは最初にシステム クラス ローダーからインターフェースを取得するため、インターフェースがロードされ、すべてが機能するはずです。

ただし、クレイジーな内部クラスローダーを使用すると、独自のインターフェイスをロードしようとする可能性があります。「-XX:+TraceClassLoading」を使用して、これが該当するかどうかを調べることができますが、1.3 jre がそのオプションを理解できるかどうかはわかりません。

さらに実験したい場合は、別のアプローチを試すこともできます。そのjarからクラスと実行したいコードの両方をロードする独自のクラスローダーを作成します。そうすれば、コードはそのjar内のクラスを直接参照できますが、アプリケーションを開始するには、「メイン」メソッドは、このクラスローダーを初期化し、リフレクションを使用して「実際の」メインクラスをロードし、実行するメソッドでなければなりませんその main() メソッドもリフレクションを介して。

于 2010-09-14T06:18:41.383 に答える
0

ほとんどの場合、クラスは異なるクラス ローダーによってロードされます。 http://mindprod.com/jgloss/classloader.htmlがヒントになるかもしれません。

于 2010-09-14T06:21:20.390 に答える