Java
パラメータアノテーション属性、アノテーションの初期値属性の読み込み部分をごそごそと作る。 ここまでの解析コード →Javaクラス解析機 080418 動作サンプル 初期値を持つアノテーション。 package com.example.annotation; import java.lang.annotation.Re…
クラス、メソッド、フィールドのアノテーション解析部分を実装。パラメータのアノテーションは未。 ここまでの解析コード →Javaクラス解析機 080417 動作サンプル Runtimeアノテーション。パラメータつき。 package com.example.annotation; import java.lan…
EnclosingMethod属性とDeprecated属性に対応。シグネチャ属性も対応したけど、解析部分が未。 現在の読み込み対応データ ★付きが今日対応したモノ。 クラスデータ 名称 サイズ 説明 magic 4byte クラスファイルを識別するためのマジックナンバー。0xCAFEBABE…
例外とインナークラス属性に対応。 現在の読み込み対応データ ★付きが今日対応したモノ。 クラスデータ 名称 サイズ 説明 magic 4byte クラスファイルを識別するためのマジックナンバー。0xCAFEBABEが入る。 minor_version 2byte クラスのマイナーバージョン…
属性の読み込みに着手。クラス属性を読み込む部分を書いて、次の2つの属性の読み込みに対応。 定数値(ConstantValue) ソースファイル(SourceFile) あと、いろいろリファクタしました。 長くなってきたのでファイルを分割して、クラス構成も大幅変更。 Class…
アノテーションがでてこないなー?とか思っていたら、参照しているドキュメントが古かったようだ。。。orz。The Class File FormatにJava5での変更が反映された版があるので(via IT アーキテクト - J2SE 5.0の新機能 第20回 バイトコードの操作)、それを元に…
メソッドの解析に対応。相変わらず属性は未サポートですが・・・。 現在の読み込み対応データ ★付きが今日対応したモノ。 クラスデータ 名称 サイズ(byte) 説明 magic 4byte クラスファイルを識別するためのマジックナンバー。0xCAFEBABEが入る。 minor_vers…
引き続き、まったり実装。 フィールド情報の読み込みまで対応 ただし、フィールドの属性(attribute)は未対応。 クラス構成をいろいろ変更。constantとかは別クラスとした。 現在の読み込み対応データ ★付きが今日対応したモノ。 クラスデータ 名称 サイズ 説…
ACC_ABSTRACTとか調べているうちに、Javaクラスの解析機を作りたくなってしまいました。 検索したらいっぱい見つかりそう。 つーか、javapでいいじゃん! とか思いつつ、でもそんなのかんけーねぇ!ということで、すみやかに着手。The JavaTM Virtual Machine …
バックアップからのビルド検証で、バックアップ物からビルドしたモノとリリース物が一致しないとなって、はまったのでメモ。 調査結果 調べてみたところ、「interfaceの定数として定義されたabstractメソッドを持つ列挙型」と「それを利用するクラス」がある…
次のような、オブジェクト入出力クラスがあって、 // フォルダ操作サービス interface FolderService { // ID(オブジェクトを示すパスを持つクラス)を指定してフォルダを得る。 Folder get( ID id ); // フォルダを登録する。 void put( Folder f ); } // フ…
JRuby1.1ではクラスに設定されたアノテーションを直接参照する方法が用意されていない様子。includeしたJavaクラスの「java_class」関数で「Java::JavaClass」というClassのラッパが返されますが、JavaのClassが持つget_annotationとかの関数は持っていませ…
Javaのソースコード自動生成が密かに?ブームです。モデルクラスとかサービスのクライアントスタブクラスとかお約束なコードは、がんがん自動生成して楽したい!ということで、Ruby+ERBでJavaBeanを作るプログラムは前に作ったのですが、あれは「yamlの定義フ…
複数条件の総当たりテストをもれなく行うためのユーティリティを書いてみました。 「条件」ごとに「取り得る値」を登録しておき、 テスト実行で、「取り得る値」を順番に変えて、総当たりで取り得るすべてのパターンを生成。パターンごとに対応する評価ロジ…
Thread#interrupt()でスレッドに割り込みます。 (特殊な場合をのぞき、)割り込まれると、スレッドの「割り込まれたフラグ」がtrueになります。 スレッドで実行中の処理がキャンセル可能であれば、定期的にこのフラグをチェックして「trueならキャンセルする…
next()でのタイムアウトをサポートするイテレータを作ってみました。 通常のjava.util.Iteratorのラッパーとして使え、 追加のAPIである「next (long timeout, TimeUnit unit)」を使うことで、タイムアウト指定ありの次要素取得が可能です。 タイムアウト有…
今日の不具合。String#replaceFirstの機能は「指定された正規表現にマッチする最初の文字列を置換する」です。「指定された文字列と同じ最初の文字列を置換する」わけではありません。サンプル。 // こういう場合はうまく置換されるけど、 String path = "/a…
インスタンスイニシャライザを指定すると、クラスのインスタンス生成時に特定の処理を行うことができます。 クラスの直下( class Hoge { /*ここ*/ } )に「{;...}」の形式で書きます。 スタティックイニシャライザと同じノリですね。 指定した処理は、オブジ…
Java5で追加されたStringBuilderについて。名前は聞いたことあるけど使ったことはなかったりするので調べてみた。以下Javadocより。 文字の可変シーケンスを表すクラス StringBuffer とだいたい同じAPIを持つ スレッドセーブではない。(StringBufferはスレッ…
文字列を「%」形式にエスケープする関数を書きました。「%」形式はURLエンコードで使われるエスケープの方式です。URLエンコードではaとかbとかURLで使える文字列をエスケープする必要はありませんが、この関数はすべての文字列を容赦なくエスケープします。…
JavaBeanを作る時にGetter,Setterを書くのメンドウですよね。Rubyみたいに attr :foo とかでアクセサを作ってくれれば良いけどあいにくJavaにそんな機能はありません。(Java SE 7でできるらしいけど。)楽する手段としてMapを使うという手がありますが、これ…
クラス定義の段階で型パラメータが決まっている場合(以下のようなクラスが該当)、Classから型パラメータで指定された型を得ることができます。(↓のクラスだと、HogeSet.classからSetの型パラメータであるString.classがとれる。) // クラス定義の段階でSetの…
ちょっと古いけど、ネタがないので喰いついてみます。→Hello, world!その2 「Hello, world!」と表示するプログラムを作ってください。ただし、コード中に同じアルファベットが2回出現してはいけません。アルファベットとは、小文字のa-zと大文字のA-Zを指…
メソッド内の処理でそのメソッド自身への参照を簡単に得る方法。Java5.0以降のみですが、JavaScriptで使えるarguments.calleeみたいなのが簡単に実現できます。...まぁ、Class#getMahod()でとれるっちゃーとれるんですが、これだとメソッド名を指定する必要…
昨日の続き。フィールド値の読み込みなど、他に気になっている操作についても測ってみました。 特定の処理を50万回実行した場合の合計所要時間を計測する。(←回数を増やした) 10回試行し平均を取得。 JRE1.4,1.5,1.6でそれぞれ測る。 書き忘れたけど、計測マ…
遅い遅いと敬遠されがちなリフレクションですが、最近のJDKでもやっぱり遅いのか計測してみました。 setメソッドを呼び出して値を設定する処理を10万回実行した際の所要時間を計測 10回試行し平均を取得。 JRE1.5,1.6でそれぞれ試した 結果 JDK1.5.0_09 JDK1…
可変長引数について。 メソッドの引数の型の末尾に「...」を付けると可変長引数を受け付けるメソッドができます。 可変長にできる引数は、一番最後の引数1つのみです。 メソッド内部では、可変長引数に配列としてアクセスできます。 /** * 可変長引数を受け…
「@Hoge("xxx")」といった感じで、パラメータを指定できるアノテーションを作ります。 作り方 アノテーションを作ります。 アノテーションにパラメータの値を返すメソッドを定義します。 メソッド追加により、パラメータを指定できるようになります。 メソッ…
タイプセーフなPropertiesを作ってみます。 用件 整数など任意の型を記録できるjava.util.Propertiesみたいなのを作りたい。 値の型はキーごとに決まるので、キーに合わせてタイプセーフにしたい。 Stringを取り得るキーの場合、値をStringで設定でき、Strin…
るびまのRSpecの記事を見たときから密かに気になってた振舞駆動開発 (Behaviour Driven Development:BDD)ですが、IBM developerWorks ビヘイビア駆動開発を舞台にした冒険より「Jbehave」というJavaでBDDするライブラリがあるらしいのでちょっと使ってみまし…