2010-11-28 4 views
0

クラスパスからバイトコードを読み込み、クラスを拡張し、クラスを定義する必要のあるクラスローダーを定義しました。私の最初の実装では、次のような行がありました。クラスパスからのバイトコードの読み取り

getResourceAsStream(name.replaceAll("\\.", File.separator)+".class"); 

しかし、私はそのハックを育てているようです。私は、ネストされたサブクラスのような境界条件に遭遇しています。この行は正しく処理されません。

正しい解決策は何ですか?

ありがとうございます!

+0

リソースは常に '/'で区切られたパス名を持ちます。 (http://download.oracle.com/javase/1.4.2/docs/api/java/lang/ClassLoader.htmlを参照) – dacwe

答えて

0

nameは、クラスのバイナリ名である場合には、リソース・ファイル名は、従来のようになります。

separator + name.replaceAll("\\.", separator) + ".class" 

クラスのbinary nameは、バイトコードファイルで使用される値であり、Class.getName()によって返されました。

リソース名の区切り文字は、必ずしもFile.separatorと同じである必要はありません。たとえば、クラスローダーがJARファイルからロードしている場合、ファイルシステムの規則ではなく、JARファイルAPIによって区切りが定義されます。

ネスト/匿名クラスのバイナリ名を使用する場合は、これがすべて動作するはずです。ただし、完全修飾クラス名のバイナリクラス名へのマッピングはコンパイラ固有であり、自動的に再現するのは容易ではありません。 (コンパイラが$n名前コンポーネントを割り当てるために使用するスキームを再現する必要があり、ソースコードにアクセスする必要があります)。クラスローダーに完全修飾名を理解させるのは難しいでしょう。しかし、それは問題ありません。通常のクラスローダーはそうではないからです。

最後に、私は「従来通り」と言いました。理論的には、マッピングを一貫して行う方法を理解できる限り、クラスファイルの命名規則を実装することができます。

+0

デフォルトのクラスローダーのように、クラスを識別する方法が必要です。既存のルックアップ・メカニズムを活用する方法がありますか? – Jim

関連する問題