androidで部 第7回 aptすごい

22
実行時コード生成 APTが秘める驚きのパワー 1 20101223日木曜日

Upload: masahiro-wakame

Post on 06-May-2015

4.480 views

Category:

Technology


2 download

TRANSCRIPT

実行時コード生成APTが秘める驚きのパワー

12010年12月23日木曜日

わかめ↓

Androidappengine

Kinect欲しい

 @vvakame

22010年12月23日木曜日

APTって何?

32010年12月23日木曜日

APTって何?• Annotation Processing Tool の略

• コンパイル時に色々処理出来ます

• アノテーションを処理できます

• コードが規約に沿っているかチェックしたり

• コードを動的に生成したりも!

42010年12月23日木曜日

わかめ meets Slim3

http://amzn.to/e8noW8

♥52010年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日木曜日

コツ

122010年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日木曜日

作ってみた!

182010年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日木曜日

なんか質問ある?Slim3 1.0.6 今日明日くらいに

リリースらしいよ? 俺 今日 2.3.1 来たけどな

えっずるい羨ましいだろ?

うん222010年12月23日木曜日