Upload
chengwc
View
249
Download
0
Embed Size (px)
Citation preview
Annotation ProcessingBenjamin Cheng
Examples
AutoValue github.com/google/auto/
AutoValue github.com/google/auto/
Butterknife jakewharton.github.io/butterknife/
Butterknife jakewharton.github.io/butterknife/
Annotation Processing
Annotation Processing (Why?)
●Reduce writing boilerplate code
●May beyond our imagination
Annotation Processing (What?)
●Part of javac
●@Annotation based
●Generate .java source files (new files only)
Components
●Annotations
●Processor
●APT (Annotation Processing Tool)
●Annotated Sources
Annotations
Annotation Processor
Annotation Processor (conti.)
Annotation Processor (conti.)
Elements
ServiceLoader Discovery File
- com/example/ExampleProcessor.class- META-INF/services/javax.annotation.processing.Processor
com.example.ExampleProcessor
Processing Rounds
javacBuilderProcessorOtherProcessor
out/
User.class
UserBuilder.class
@Otherpublic class GeneratedClass { // …}
Processing Rounds (conti.)
javacBuilderProcessorOtherProcessor
out/
User.class
UserBuilder.classpublic class OtherGenClass { // …}
GeneratedClass.class
Processing Rounds (conti.)
javacBuilderProcessorOtherProcessor
out/
User.class
UserBuilder.classpublic class OtherGenClass { // …}
GeneratedClass.class
Processing Rounds (conti.)
javacBuilderProcessorOtherProcessor
out/
User.class
UserBuilder.class
GeneratedClass.class
OtherGenClass.class
Add to APT Classpath
Code Generation
Code Generation
●StringBuilder
●JavaPoet
JavaPoet
●Use Fluent API with builders
●Based on Specs○ TypeSpec
○ MethodSpec
○ ParameterSpec
○ FiledSpec
github.com/square/javapoet/
JavaPoet (conti.)github.com/square/javapoet/
JavaPoet (conti.)github.com/square/javapoet/
public final class UserBuilder { … }
JavaPoet (conti.)github.com/square/javapoet/public final class UserBuilder { // fields private String username;}
JavaPoet (conti.)github.com/square/javapoet/
JavaPoet (conti.)github.com/square/javapoet/
JavaPoet (conti.)github.com/square/javapoet/
Testing and Debugging
Testing and Debugging
●Guava
●compile-testing
●Truth
References●Droidcon NYC 2016 - @Eliminate("Boilerplate")
https://youtu.be/NBkl_SIHUr8
●#droidconDE 2015: Hannes Dorfmann – Annotation Processing 101 https://youtu.be/43FFfTyDYEg http://hannesdorfmann.com/annotation-processing/annotationprocessing101
●Android Tech Talk: Annotation Processing Boilerplate Destruction by Jake Wharton https://youtu.be/dOcs-NKK-RA https://speakerdeck.com/jakewharton/annotation-processing-boilerplate-destruction-square-waterloo-2014
●The 10-step guide to annotation processing in Android studio by Chris Logan http://blog.stablekernel.com/the-10-step-guide-to-annotation-processing-in-android-studio
Q&A