techiumスマートフォン用の表示で見るtechiumこのブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。いただけますと気が向いたら調査するかもしれません。この広告は、90日以上更新していないブログに表示しています。Annotation独自のAnnotationを定義したものを利用してコードの自動生成を行う方法について説明します。独自のAnnotationの作り方はこちらを参照して下さい。Processorという機能を利用して行います。Processorを利用することができます。Processorを使って自動生成するライブラリを作り、android-aptを利用しないでコードの自動生成をしていましょう。Libraryモジュールを作成します。Module...を選択します。選択すると下図が表示されます。Libraryを選択すると下図のようにライブラリ名とパッケージ名、新規モジュール内に自動生成するファイル名を聞かれます。今回は例として次のように設定しました。AnnotationProcessorSampleそうすると下記のようなbuild.gradleとAnnotationProcessorSample.javaが生成されます。{}これで準備が整いました。独自Annotationの定義まずは独自Annotaitonを作成します。今回は例としてCustomAnnotationというAnnotaionを下記のように作成しました。{}Annotationはこまかく設定することができますが今回の例では説明しません。知りたい方はこちらを参考にしてください。ProcessorでAbstractProcessorを継承したクラスの呼び出しを行っておもらえるようにします。AbstractProcessorを継承したクラスを下記のように作成します。Processorを動かすにあたって何のAnnotationに対して処理を動かすのかを@SupportedAnnotationTypesにて定義します。上記の例では独自定義のAnnotationであるCustomAnnotationを定義しています。注意する点としてはパッケージをフルで記載しないと正しく動作しないため注意してください。Processorの要求するJavaのバージョンを記載します。上記の例ではSourceVersion.RELEASE_7を指定しておりJava7を要求しています。SourceVersion.RELEASE_8にするとJava8の要求になりbuild.gradleのsourceCompatibilityとtargetCompatibilityを1.8にするとビルドすることができるようになります。このライブラリを利用するアプリもJava8を要求されることになるためJackとcompileOptionsで1.8を指定することになりますので注意してください。次にAbstractProcessorを継承するとprocessメソッドが必須となります。そのため22行目でprocessを実装しています。Processorが動くタイミングでprocessメソッドが呼び出されます。そこで生成するファイルの中身を定義してファイルに書き出すことを実施します。23行目〜36行目まではStringBuilderで自動生成するjavaファイルの中身をappendで追加しています。今回の例では独自のAnnotationをつけているメソッドやクラス名を取得してgetMessageというメソッドで独自Annotationを利用している名前を列挙して文字列で返却できるようにしています。38行目〜49行目まででファイルの書き込みを行っています。ここでprocessingEnvというのを使っています。processingEnvはAbstractProcessorに定義されている変数でgetFilerメソッドを実行することで書き出し先のファイルに関する処理を行うためのインターフェースを取得することができます。今回はcreateSourceFileを使ってソースファイルを新規作成すること行いました。これ以外にもリソースファイルやクラスファイルを生成することもできます。ここでcreateSourceFileの引数に自動生成するファイルのクラスをフルパスで指定することになります。注意すべきなのはStringBuilder指定しているパッケージ名と吐き出すクラスのパッケージを合わせていないとエラーになるので注意してください。createSourceFileで取得したJavaFileObjectに対してwriteすることでファイルの吐き出しを行います。そのwriteを実行する際に渡すデータがStringBuilderで作った文字列を渡すことでその内容通りに自動生成されることになります。これで自動生成部分の処理は完成です。最後にMETA-INFに定義を追加します。プロジェクトの「<プロジェクト名>/lib/src/main/resources/META-INF/services」にフォルダを作成し「javax.annotation.processing.Processor」というファイルを作成し下記のように記述します。[javax.annotation.processing.Processor]com.hatenablog.techium.annotation.processor.AnnotationProcessorSampleここで記述するのはAbstractProcessorを継承したクラスを記載します。これで準備が整いました。libのモジュールをビルドすると「lib/build/libs/lib.jar」が作成されます。このjarファイルの内部構成は次のようになっていればOKです。コード自動生成のAnnotationを使ってみるlib.jarを利用したいプロジェクトのlibsにコピーします。そのプロジェクトのbuild.gradleに下記を記載します。...}dependenciesにannotationProcessorでコピーして持ってきたJarファイルを指定してあげます。これで利用できるようになりましたので下記のようにAnnotationをつけてみてビルドしてみましょう。}}上記のように@CustomAnnotationをつけてビルドすると「app/build/generated/source/apt/debug/com/hatenablog/techium/annotation/processor/generated」内にGeneratedClassが自動生成されます。生成された内容は次のようになります。}}それでは次のように自動生成したGeneratedClassを使って見ましょう。}}実行すると次のようなログが表示され自動生成したコードがきちんと動いていることが確認できます。Firebase2017-11-23BottomNavigationViewのテストAndroidはてなブログをはじめよう!kobashin__Gさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。