androidで部 第7回 aptすごい
TRANSCRIPT
APTって何?• Annotation Processing Tool の略
• コンパイル時に色々処理出来ます
• アノテーションを処理できます
• コードが規約に沿っているかチェックしたり
• コードを動的に生成したりも!
42010年12月23日木曜日
Slim3のAPT活用例• Entity ⇔ Model のマッピング
• Map<String, Object> と
POJOのマッピングみたいな感じ
• 型安全なコードが書けるよに!
• Reflectionを使わないので高速!
62010年12月23日木曜日
←今まで これから→• 実行時にReflection
• エラーは実行時
• 実行時間割と長め
• 型安全じゃない
• コンパイル時に生成
• エラーはコンパイル時
• 実行時間割と短め
• 型安全である
72010年12月23日木曜日
注意
JavaSE5とJavaSE6 でAPIが違います。Slim3他、多くの解説ではJavaSE5で実装されています。JavaSE5 → com.sun.mirror 以下.
JavaSE6 → javax.model 以下. JSR 269
僕はJavaSE6のAPIで実装しました。
82010年12月23日木曜日
ざっくり解説• AbstractProcessor
• 親玉 総本山 処理の本体• Messager
• ログ出力を行ったり任意のフィールドなどをWarningやErrorにしたりできる
• ProcessingEnvironment• 新規ファイルやElements, Types (Util系)が取り出せる
• RoundEnvironment• 注釈処理のラウンドに含まれる情報
(Annotationの情報)が取り出せる
92010年12月23日木曜日
ざっくり解説• Element
• クラスとか型とかフィールドとかメソッドとか色々な物を表す
• javax.lang.model.element.* 見て!
• TypeMirror• 型を表す Primitiveとか他いろいろ
• javax.lang.model.type.* 見て!
102010年12月23日木曜日
特殊な設定ファイル
• 自作APT一式をjarにまとめる時必要
• META-INF/services/ javax.annotation.processing.Processor
• 中身は自作ProcessorのFQNFQN = package名+クラス名
112010年12月23日木曜日
デバッグ方法• @Kazzz さんがブログに書いてくれてる
• http://d.hatena.ne.jp/Kazzz/20101208
• Aptina を使う
• 自作ProcessorのJUnitが書ける!• http://d.hatena.ne.jp/koichik/20090620
• printfデバッグ
• EclipseのErrorLogビューに出力できる
132010年12月23日木曜日
中途半端なソース生成×
• ソースコード生成中にエラーを発見し、途中で中断したい場合がある
• 中途半端なコードを生成しない!
• 2pass で処理するエラー検出→実際にコード生成
142010年12月23日木曜日
FQN最高• ソース生成の時にimportを出力しない
• 考える事が多くて脳味噌ぼーんする
• Listよりjava.util.List
• あーこーゆーソース見たわー機械生成したコードで見たことあるわー
152010年12月23日木曜日
生成するコードについて• 適切に改行を入れる
• いきなり正しいコードの生成は辛い
• 生成コードのエラー箇所知りたい
• インデントも頑張ってつける
• 生成コードの可読性大事
162010年12月23日木曜日
分割コンパイル怖い• APT利用プロジェクトで、ソース全体を一度にビルドしないパターンがある• 普通にコード書いて保存した時のコンパイルとかそれ
• Annotation保持のレベルによってはコンパイル済クラスのAnnotation取れない…
• 最初ハマった• RetentionをSOURCE→CLASSに…orz
172010年12月23日木曜日
JsonPullParser作った!
• https://github.com/vvakame/JSONPullParser
• APTでJson→POJOマッピング用Javaコード生成
• Androidでも動くよ! http://bit.ly/hFTbtP
• Tweetを逐次読込→1Tweet毎に表示
• pom.xml改善, Benchmark, 速度改善patch求ム
192010年12月23日木曜日
性能もなかなか• 6000個のTweetをパース (MacBookPro)• JsonPullParser (POJO Mapping)
• 約1200ms• Jsonic (POJO Mapping)
• 約4400ms• JsonLib(JSONArray convert)
• 約3300ms• Jackson
• 使い方分からずorz
202010年12月23日木曜日
見所
• ClassWriterHelper.java
• ソース生成支援, 2pass処理支援 etc
• Log.java
• android.util.LogのAPT版
212010年12月23日木曜日