ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

CLASS内のアノテーションをJavassistで読み込む

2007-11-14 02:22:59 | PG(Java)

RetentionがRUNTIMEのアノテーションは実行時に読み込めるが、CLASSは当然読めない。
Javassistではどうかなーと思って試してみたら、RUNTIMEもCLASSも読めた!(SOURCEは当然読めない)
(ちなみにjavapだとアノテーションがあるんだかどーなんだかよー分からん(爆))

これで、あるディレクトリ内の全classファイルを走査して特定のアノテーションがあるかどうか調べる、なんてプログラムが作れるわけだ。
…ソースをgrepした方が早いかもしれないが(爆)
……いやいや!コメントアウトされてるのを除外したりアノテーションの値を取ったりしようと思ったら、プログラマティックに出来た方が簡単確実だよ、ね^^;


JDK1.5のリフレクション

2007-11-13 23:59:50 | PG(Java)

JDK1.5のリフレクションでは、引数ありコンストラクターを使ったインスタンス化引数つきのメソッド呼び出し配列から可変引数に変更されていたのに気付いた。
決まったメソッドをリフレクションで呼び出すなら、こっちの方が書きやすいな~。

つーか、引数無しも「invoke("メソッド名");」だけで呼び出せることになるから、便利だな。


Javassist試行

2007-11-12 02:18:54 | PG(Java)

バイトコードを変更できるJavassistを試してみた。
書き換えの方法は慣れてみれば非常にシンプル。Javaソースの形で書いて差し替えられるなんてすごいなぁ。

実際のところ、クラスローダーとかに当てはめる方法の方が苦労するかも。
クラスローダーなんてよく知らないし。下手すると動かなくなるからなぁ。ってそれはバイトコード書き換え自体がそうか(汗)
同じクラスでもクラスローダーが異なれば別クラス扱い(instanceofがfalseになる)なので、ソースの見た目からは分かりづらいバグの温床になるし。

JDK1.5から出来るようになったという、main()の実行前にバイトコード変更クラスを登録するやり方のほうが堅実っぽい気がする。jarファイルをいちいち作らなきゃいけないのがちょっと面倒だけど。


バイトコード・逆アセンブル

2007-11-11 04:20:55 | PG(Java)

Javaはコンパイルすると中間言語のようなバイトコードに変換されることは知っていたけれど、その内容にまで立ち入る気は無かったのだが。

ちょっと見てみて、なんとなく分かるような分からないような感じなので軽く調べてみようと思っただけなのに、思ったよりは深入りしてしまった(苦笑)
dupの動作説明文は理解できるけどどうしてそんな動きが必要なのかと思ったが、図を描いてみたら分かった。

しかしまぁ、バイトコード辺りは興味ある人だけいじってる感じだろうなぁ。アセンブラだって、今時あんまりやる人いないだろうしなぁ。最近の人って、スタックの動作とかCPUのレジスターの基礎とか、勉強する機会あるんだろうか。
(↑CPUとか呼んでる時点で古い(爆))


アノテーションの定義方法

2007-11-10 21:49:11 | PG(Java)

ちょっとアノテーションでも作ってみようかな~と思って実験。

使い道が単純なだけに定義方法もシンプル、と思いきや、微妙に色々な指定が多いかも。

アノテーションが指定できる場所って、メソッド内にはほとんど無いんだなー。
というか、ローカル変数への指定っていうのは一体何に(というかどうやって)使うんだろう??