- PR -

読み込まれたlibraryの名前を調べるには?

1
投稿者投稿内容
ヒロシマケン
会議室デビュー日: 2005/05/13
投稿数: 10
投稿日時: 2006-12-01 09:45
System.loadLibrary()メソッドですでに読み込まれているlibraryの名前を調べる方法はあるのでしょうか?
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2006-12-01 12:58
ヒロシマケンさん、こんにちは。

そのための APIは無いと思います。

沢山のメッセージを受け取ることになるかもしれませんが、VM起動時の
オプションで -verbose:jni をつけるとヒントが得られるかも知れません。

あと、リフレクションの使用が許されるなら、実装に依存しますが、
下記のコードで表示できるかも知れません。
コード:
ClassLoader loader = ClassLoader.getSystemClassLoader();

Class cls = ClassLoader.class;
Field field = cls.getDeclaredField("loadedLibraryNames");
field.setAccessible(true);
Vector v = (Vector)field.get(loader);
Iterator iterator = v.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}


Sunの JDK 1.5.0 Windows版では何か(zip.dll)を表示しましたが、
漏れなく表示したかはわかりません。参考です。

[ メッセージ編集済み 編集者: Kissinger 編集日時 2006-12-01 13:02 ]
ヒロシマケン
会議室デビュー日: 2005/05/13
投稿数: 10
投稿日時: 2006-12-01 21:38
Kissingerさん

返信ありがとうございます。試してみた所、時分の環境では

Vector v = (Vector)field.get(loader);

の所でエラーが出てしまいました(JDK 1.5/WIndows XP)。

java.lang.ClassCastException: java.lang.Boolean
....

ちなみに
Field [] fields = cls.getDeclaredFields();
にすると20個のフィールドが時分の環境ではでました。空ではないようなのですが、、、。何か策がありますでしょうか?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-12-01 22:43
>Kissingerさん

細かい突っ込みで申し訳ないですが、
ClassLoader#loadedLibraryNamesはstaticなので、
Field#get(Object)の引数はnullでOKですよ。
coasm
大ベテラン
会議室デビュー日: 2001/11/26
投稿数: 237
投稿日時: 2006-12-01 23:30
コード:
ClassLoader loader = ClassLoader.getSystemClassLoader();
System.out.println(loader.getClass().getCanonicalName());


で、何と出ますか?
sun.misc.Launcher.AppClassLoader だったら、Kissingerさんのやり方でできるはずですが。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2006-12-04 12:47
おお!
かつのりさんのとおり、 staticでした。
つっこみありがとう。

java.lang.Booleanというのはまだ理解できません。
時間のあるときに調べてみますが、わかるかどうか…
Jaune
会議室デビュー日: 2006/12/02
投稿数: 16
投稿日時: 2006-12-05 01:26
はじめまして。
私の見当違いだったらすみません。

引用:

ヒロシマケンさんの書き込み (2006-12-01 21:38) より:
ちなみに
Field [] fields = cls.getDeclaredFields();
にすると20個のフィールドが時分の環境ではでました。空ではないようなのですが、、、。何か策がありますでしょうか?



もしかして以下のようなコードになっているのでしょうか?

コード:

ClassLoader loader = ClassLoader.getSystemClassLoader();
Class cls = ClassLoader.class;
Field[] fields = cls.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
field.setAccessible(true);
Vector v = (Vector) field.get(loader);

......
}




だとすると fields[0] には ClassLoader.class の
initialized という boolean 値のフィールドが入っているので
java.lang.ClassCastException: java.lang.Boolean
が起きるのは納得できるのですが・・・


追記:
ソースコードに
field.setAccessible(true);
を忘れてました

[ メッセージ編集済み 編集者: Jaune 編集日時 2006-12-16 02:08 ]
1

スキルアップ/キャリアアップ(JOB@IT)