したjarファイル内のクラスがある条件を満たしているかを調べたい。クラスが大量にあるので、いちいちデコンパイルするわけではなく、一律にある条件にしたがっているかをチェックするだけ。このjarの実行に必要なライブラリを前提とはしない。単純に一つの.classファイルが与えられたときに、それを機械的にチェックしたい。Javassistの利用Javassistは本来、バイトコードの操作のために用いられるが、しかし、デコンパイルを目的としない.classファイルの調査にも利用することができそうだということで、このあたりを調べてみた。条件としては、あくまでもその.classしか与えられておらず、そこから呼び出される他のクラスを前提とせずに調査したい。特定のアノテーションが付けられているかどうか、jarファイル内のすべての.classについて調べ、そのアノテーションのlong値のkey()メンバーの値を取得する。jarファイルの.classをすべて調べ、所望のアノテーション付のクラスを集める。指定クラスが所望のアノテーション付であるかを調べる。注意:JavassistのCtClass#getAnnotations()あるいはCtClass#getAvailableAnnotations()は使用しないこと。これは、クラスをロードしようとするらしく、ライブラリが無いとエラーになる。long値:所望のアノテーション付クラスのキー値、null:所望のアノテーションクラスではない。ClassFile#getAttributes()の返すオブジェクトはAttributeInfoのサブクラス。}}あるクラス中のstatic初期化子の内容を調べる例えば、以下のようなクラスがあったとする。};}この初期化子をすべて取得したい。実際にはこれらの初期化子というのは、static変数に代入するためのバイトコードになっている。単純な「クラス名のテーブル」のようなものがあるわけではない。これを調べるには基本的にはバイトコードを解釈しなければならないのだが、Javassistあるいは他のバイトコード操作ライブラリでも簡単に行う方法は無いように思える。.classファイルのコンスタントプールには、クラス内で使われるすべてのコンスタントが格納されているので、それを調べることにした。クラス情報にキャストしているので、エラーの場合は無視する。}}Javassist取扱上の注意点Javassistで扱うクラスを「ロード」しようとすると、そのクラスに必要なライブラリが無い場合には例外が発生してしまう。これが、CtClassのtoClass()を呼び出すと起こってしまうし、CtClassのgetAnnotations()を呼び出しても同じことのようだ。基本的にはClassFileが.classファイルを表しており、その範囲内で操作を行った方が無難。ysugimura関連記事Java:Optionalチートシート頭が悪くて良く使い方を忘れるのでチートシートを書いておく。...実行中クラスのクラスパスもしくはjarファイルの取得Javaのプログラム実行時に、以下を検出したい場合がある。...Java:WebSocketクライアントを作成するJavaアプリをWebSocketクライアントにしてみる。コメントをキャンセルメールアドレスが公開されることはありません。*ウェブサイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。上に表示された文字を入力してください。