4. Agenda
What is Annotation Processor?
How does it work?
Project structure
Create Annotation Processor
How to debug Processor’s code?
Demo time!
How to setup a goal?
17. public class Person {
private String firstName;
private String lastName;
private Date birthday;
}
@Pojo
18. @Pojo
public class Person {
private String firstName;
private String lastName;
private Date birthday;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public Date getBirthday() {
return birthday;
}
19. Where to get source data to generate code?
Before we start
Inheritance vs Composition
What should be a start point for our processor?
21. public static final Creator<Contact> CREATOR =
new Creator<Contact>() {
@Override
public Contact createFromParcel(Parcel source) {
return new Contact(source);
}
@Override
public Contact[] newArray(int size) {
return new Contact[size];
}
};
...
Inheritance
public class Contact implements Parcelable {
}
22. public class Contact implements Parcelable {
}
Inheritance
...
public Contact() {
}
Contact(Parcel source) {
...
}
...
23. public class Contact implements Parcelable {
}
Inheritance
...
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int flags) {
...
}
24. class Smart_Contact extends Contact {
// creator
// constructor
// methods from Parcelable
}
@SmartParcelable
public abstract class Contact implements Parcelable {
}
Inheritance
25. class Smart_Contact extends Contact {
// creator
// constructor
// methods from Parcelable
}
@SmartParcelable
public abstract class Contact implements Parcelable {
public static Contact create() {
return new Smart_Contact();
}
}
Inheritance
26. Composition
@RuntimePermissions
public class MainActivity extends AppCompatActivity {
...
public void onMigrateImageClicked(View v) {
MainActivityPermissionsDispatcher
.migrateImageWithPermissionCheck(this);
}
@NeedsPermission(WRITE_EXTERNAL_STORAGE)
void migrateImage() {
...
}
}
27. Composition
@RuntimePermissions
public class MainActivity extends AppCompatActivity {
...
public void onMigrateImageClicked(View v) {
MainActivityPermissionsDispatcher
.migrateImageWithPermissionCheck(this);
}
@NeedsPermission(WRITE_EXTERNAL_STORAGE)
void migrateImage() {
...
}
}
28. Composition
@RuntimePermissions
public class MainActivity extends AppCompatActivity {
...
public void onMigrateImageClicked(View v) {
MainActivityPermissionsDispatcher
.migrateImageWithPermissionCheck(this);
}
@NeedsPermission(WRITE_EXTERNAL_STORAGE)
void migrateImage() {
...
}
}
29. Where to get source data to generate code?
What should be a start point for our processor?
Before we start
Inheritance vs Composition
Effort of using your generated code vs creating a boilerplate code
51. Write a simple Class
package roomie.example;
public class DemoImpl extends Demo {
int counter;
public void print(String msg) {
System.out.println(msg);
}
}
52. Write a simple Class: raw text
JavaFileObject sourceFile =
filer.createSourceFile(qualifiedName, annotatedClass);
try (Writer writer = sourceFile.openWriter()) {
writer.append("package ");
writer.append(packageName).append(";nn");
writer.append("public class ").append(className);
writer.append(" extends ");
writer.append(annotatedClass.simpleName()).append(" {n");
writer.append(" int counter;nn");
writer.append(" public void print(String msg) {n");
writer.append(" System.out.println(msg);n");
writer.append(" }n");
writer.append("}n");
writer.flush();
}