- - PR -
Jar ファイルからのクラス読み込み処理
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-12-13 01:35
厚かましいのを承知で、これだけ教えていただけませんか??
これで実行すると、一つのクラスについては、.adaptedファイルを吐き出すのですが、その後エラーが出て終了します。 defineClassの部分なのですが、どうしてもわかりません。 けっこう切羽詰っているので最後のチャンスだと思ってお聞きします。 お分かりの方いらっしゃいましたら、どうか教えていただければと思います。 よろしくお願いします。 | ||||||||
|
投稿日時: 2006-12-13 01:38
とりあえず、どういたエラーが発生するかだけでも貼り付けてはいかがでしょうか?
| ||||||||
|
投稿日時: 2006-12-13 04:39
そうでした。
すみません。 エラーは下記のようなものが出ました。
Adapt.java:95は、return defineClass(name, bytes, 0, bytes.length);の部分で、 Adapt.java:136は、Class clas = loader.loadClass(className);の部分です。 クラスパスを任意ファイル(jar)に指定して動かしてみました。 よろしくお願いします。 | ||||||||
|
投稿日時: 2006-12-13 10:00
defineClassで定義しようとしたクラスの依存クラスが解決できないからでは?
ちょっと原因がはっきりわかりませんが。Aの定義ってどうなっていますか? | ||||||||
|
投稿日時: 2006-12-13 11:05
>かつのりさん
Aの定義というのは、Aのクラスファイルの中身ということですか? | ||||||||
|
投稿日時: 2006-12-13 11:19
親クラスローダがbase.getParent()だからではないですか? システムクラスローダのさらに親からの分岐になってしまいます。 あと、main()から起動されるので問題ないと思いますが、 親クラスローダにシステムクラスローダを使うのは良くないです。 Adapt.class.getClassLoader() Thread.currentThread().getContextClassLoader() Servletコンテナ等で動かす場合に親子関係の問題が起こるので、 このどちらかを親クラスローダとする方がよいと思います。 #Java EEなコンテナだとSecurityManagerの問題も起こりえますけど。 | ||||||||
|
投稿日時: 2006-12-13 11:56
>あしゅさん
さっそく実行してみました。 が、以前同様のエラーメッセージが出続けています。 念のため確認なのですが、この際の親クラスローダを変更するというのは、 ClassLoader base = ClassLoader.getSystemClassLoader(); を、 ClassLoader base = Adapt.class.getClassLoader(); のように変更することですよね? | ||||||||
|
投稿日時: 2006-12-13 12:07
親とするクラスローダ自体はそうです。
このbase.getParent()が怪しいです。baseでいいのでは? それでも解決しない場合は、 JARに含まれるクラスを親クラスローダで解決可能であるか確認し、 解決できる場合はクラスパスから除外する必要があると思います。 もしくはJava標準の「親から子」から「子から親」の委譲ポリシーに 変更することでも対応できますが、さらにはまる事になると思います。 まずは、バイトコードの改変の前に単純にロードできるか確認すべきでは? |