Annotation-Based Code Generator in Java — Overview [1/4]

Aditya Solge
3 min readAug 31, 2023

In the world of Java development, automation and efficiency are crucial aspects. Annotation-based code generation is a technique that empowers developers to automate the creation of repetitive and boilerplate code. In this tutorial, we will dive into creating our own annotation-based code generator in Java, similar to popular libraries like Lombok, Google Guice, and Spring/Spring Boot. If you’re more of a visual learner, you can also find a detailed video tutorial on this topic in this YouTube playlist.

All parts of this project series

What to Expect in the Tutorial?

This tutorial is structured into three distinct parts, each building on the previous one:

1. What are Java Annotations and How to create Custom Annotations?

Before we delve into building our code generator, it’s essential to understand what Java annotations are and how they work. We’ll also create custom annotations that will serve as the foundation for our code generation process.

2. Processor for Code Generator

We will develop a processor responsible for generating code based on these annotations. I’ll walk you through mental model and generation of challenging pieces of the processor.

3. Packaging Code Generator, and Using Code Generator

The final part of the tutorial focuses on how to package the code generator and, most importantly, how to utilize it effectively.

What We Will Implement

In this project, we are going to create an annotation-based code generator that can automatically generate file-based data access layer (DAO) classes for any model or DTO class. These generated classes will enable CRUD operations (Create, Read, Update, Delete) to persist and retrieve data from a local file.

The Annotations

Three annotations will play a pivotal role in our project:

  1. @FileDBGenerated: Annotate the model class you want to generate the data layer for.
  2. @Persisted: Annotate fields within your model class that should be persisted in the file-based database.
  3. @UniqueKey: Apply this annotation to the primary key or unique key field that uniquely identifies records.

For instance, here’s how the annotations could be used in a Student model class:

import com.gogettergeeks.annotation.FileDBGenerated;
import com.gogettergeeks.annotation.Persisted;
import com.gogettergeeks.annotation.UniqueKey;

@FileDBGenerated
public class Student {
@Persisted
private String name;

@Persisted
@UniqueKey
private int rollNumber;

private double percentage;

// Getters and setters...
}

Upon building the project, the code generator will automatically create the following classes:

  • StudentDao: An interface defining CRUD operations.
  • StudentDaoImpl: An implementation of the interface methods.
  • StudentDtoGenerated: An internal DTO containing fields marked with @Persisted or @Unique annotations.
  • StudentRequestException: An exception representing issues with user requests, not suitable for retries.
  • StudentServiceException: An exception representing internal processing issues within the DAO layer.

Next Steps

If the prospect of creating a high-impact project with minimal effort excites you, then you’re in for a treat. This tutorial equips you with the knowledge and tools to embark on this journey. So, are you ready to dive into the world of annotation-based code generation and create something extraordinary? If the answer is yes, don’t wait any longer — start following the tutorial right now!

Resources

--

--

Aditya Solge

I'm a full-time freelance software developer who used to work at Amazon. I help students with affordable learning at www.gogettergeeks.com.