JavaPoet is a Java API for generating .java source files programmatically with support for modern Java features including records and sealed types
FieldSpec is the specification for field declarations. It provides a fluent API for building field definitions with type, name, modifiers, initializers, annotations, and documentation.
Create builders for field declarations.
/**
* Creates a builder for a field declaration
* @param type - The field type as TypeName
* @param name - The field name
* @param modifiers - Optional modifiers for the field
* @return Builder for configuring a field
*/
static FieldSpec.Builder builder(TypeName type, String name, Modifier... modifiers);
/**
* Creates a builder for a field declaration using reflection Type
* @param type - The field type as reflection Type
* @param name - The field name
* @param modifiers - Optional modifiers for the field
* @return Builder for configuring a field
*/
static FieldSpec.Builder builder(Type type, String name, Modifier... modifiers);Usage Examples:
// Simple field
FieldSpec name = FieldSpec.builder(String.class, "name", Modifier.PRIVATE)
.build();
// Field with initializer
FieldSpec count = FieldSpec.builder(int.class, "count", Modifier.PRIVATE)
.initializer("$L", 0)
.build();
// Parameterized type field
TypeName listOfStrings = ParameterizedTypeName.get(List.class, String.class);
FieldSpec items = FieldSpec.builder(listOfStrings, "items", Modifier.PRIVATE, Modifier.FINAL)
.initializer("new $T<>()", ArrayList.class)
.build();Access the properties of a FieldSpec.
/**
* Returns the field type
* @return TypeName of the field
*/
TypeName type();
/**
* Returns the field name
* @return The field name
*/
String name();
/**
* Returns the Javadoc comment
* @return CodeBlock containing Javadoc
*/
CodeBlock javadoc();
/**
* Returns the annotations on this field
* @return List of AnnotationSpec
*/
List<AnnotationSpec> annotations();
/**
* Returns the modifiers for this field
* @return Set of Modifier
*/
Set<Modifier> modifiers();
/**
* Returns the initializer expression
* @return CodeBlock for field initialization (may be empty)
*/
CodeBlock initializer();Convert to a builder for modification.
/**
* Creates a builder initialized with this field's properties
* @return Builder for modifying this FieldSpec
*/
FieldSpec.Builder toBuilder();The builder for configuring FieldSpec instances.
Add Javadoc comments to the field.
/**
* Adds Javadoc documentation from a format string
* @param format - Format string for Javadoc
* @param args - Arguments for format placeholders
* @return This builder for chaining
*/
FieldSpec.Builder addJavadoc(String format, Object... args);
/**
* Adds Javadoc documentation from a CodeBlock
* @param block - CodeBlock containing Javadoc
* @return This builder for chaining
*/
FieldSpec.Builder addJavadoc(CodeBlock block);Usage Example:
FieldSpec maxRetries = FieldSpec.builder(int.class, "MAX_RETRIES",
Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
.addJavadoc("Maximum number of retry attempts before giving up.\n")
.addJavadoc("\n")
.addJavadoc("<p>This value is used by the retry mechanism to limit\n")
.addJavadoc("the number of consecutive failures.\n")
.initializer("$L", 3)
.build();Add annotations to the field declaration.
/**
* Adds multiple annotations
* @param annotationSpecs - Iterable of annotations to add
* @return This builder for chaining
*/
FieldSpec.Builder addAnnotations(Iterable<AnnotationSpec> annotationSpecs);
/**
* Adds an annotation from an AnnotationSpec
* @param annotationSpec - The annotation to add
* @return This builder for chaining
*/
FieldSpec.Builder addAnnotation(AnnotationSpec annotationSpec);
/**
* Adds an annotation by ClassName
* @param annotation - The annotation class name
* @return This builder for chaining
*/
FieldSpec.Builder addAnnotation(ClassName annotation);
/**
* Adds an annotation by Class
* @param annotation - The annotation class
* @return This builder for chaining
*/
FieldSpec.Builder addAnnotation(Class<?> annotation);Usage Examples:
// Simple annotation
FieldSpec id = FieldSpec.builder(Long.class, "id", Modifier.PRIVATE)
.addAnnotation(Id.class)
.build();
// Annotation with members
FieldSpec email = FieldSpec.builder(String.class, "email", Modifier.PRIVATE)
.addAnnotation(AnnotationSpec.builder(Column.class)
.addMember("name", "$S", "email_address")
.addMember("unique", "$L", true)
.build())
.build();
// Multiple annotations
FieldSpec timestamp = FieldSpec.builder(LocalDateTime.class, "createdAt", Modifier.PRIVATE)
.addAnnotation(Column.class)
.addAnnotation(Temporal.class)
.addAnnotation(NotNull.class)
.build();Add modifiers to the field declaration.
/**
* Adds modifiers to the field (e.g., PRIVATE, STATIC, FINAL)
* @param modifiers - Modifiers to add
* @return This builder for chaining
*/
FieldSpec.Builder addModifiers(Modifier... modifiers);Usage Examples:
// Private instance field
FieldSpec name = FieldSpec.builder(String.class, "name")
.addModifiers(Modifier.PRIVATE)
.build();
// Public static final constant
FieldSpec version = FieldSpec.builder(String.class, "VERSION")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
.initializer("$S", "1.0.0")
.build();
// Protected field
FieldSpec logger = FieldSpec.builder(Logger.class, "logger")
.addModifiers(Modifier.PROTECTED, Modifier.FINAL)
.build();Set the initializer expression for the field.
/**
* Sets the field initializer from a format string
* @param format - Format string for initializer expression
* @param args - Arguments for format placeholders
* @return This builder for chaining
*/
FieldSpec.Builder initializer(String format, Object... args);
/**
* Sets the field initializer from a CodeBlock
* @param codeBlock - CodeBlock for initializer expression
* @return This builder for chaining
*/
FieldSpec.Builder initializer(CodeBlock codeBlock);Usage Examples:
// Primitive initializer
FieldSpec count = FieldSpec.builder(int.class, "count", Modifier.PRIVATE)
.initializer("$L", 0)
.build();
// String initializer
FieldSpec name = FieldSpec.builder(String.class, "name", Modifier.PRIVATE)
.initializer("$S", "default")
.build();
// Object instantiation
FieldSpec list = FieldSpec.builder(
ParameterizedTypeName.get(List.class, String.class),
"items",
Modifier.PRIVATE,
Modifier.FINAL)
.initializer("new $T<>()", ArrayList.class)
.build();
// Static initializer
FieldSpec logger = FieldSpec.builder(Logger.class, "LOGGER",
Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL)
.initializer("$T.getLogger($T.class)", LoggerFactory.class, MyClass.class)
.build();
// Complex expression
FieldSpec pattern = FieldSpec.builder(Pattern.class, "EMAIL_PATTERN",
Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL)
.initializer("$T.compile($S)", Pattern.class, "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$")
.build();
// CodeBlock initializer
CodeBlock initializer = CodeBlock.builder()
.add("new $T<>()", HashMap.class)
.build();
FieldSpec config = FieldSpec.builder(Map.class, "config", Modifier.PRIVATE)
.initializer(initializer)
.build();Build the final FieldSpec instance.
/**
* Builds the FieldSpec with configured properties
* @return The built FieldSpec instance
*/
FieldSpec build();// String constant
FieldSpec apiKey = FieldSpec.builder(String.class, "API_KEY",
Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
.initializer("$S", "your-api-key")
.build();
// Numeric constant
FieldSpec timeout = FieldSpec.builder(int.class, "TIMEOUT_SECONDS",
Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
.initializer("$L", 30)
.build();// Immutable list
FieldSpec colors = FieldSpec.builder(
ParameterizedTypeName.get(List.class, String.class),
"COLORS",
Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL)
.initializer("$T.of($S, $S, $S)", List.class, "red", "green", "blue")
.build();
// Mutable map
FieldSpec cache = FieldSpec.builder(
ParameterizedTypeName.get(
ClassName.get(Map.class),
ClassName.get(String.class),
ClassName.get(Object.class)),
"cache",
Modifier.PRIVATE, Modifier.FINAL)
.initializer("new $T<>()", ConcurrentHashMap.class)
.build();FieldSpec optional = FieldSpec.builder(String.class, "description", Modifier.PRIVATE)
.addAnnotation(Nullable.class)
.build();FieldSpec serialVersionUID = FieldSpec.builder(long.class, "serialVersionUID",
Modifier.PRIVATE, Modifier.STATIC, Modifier.FINAL)
.initializer("$LL", 1)
.build();class FieldSpec {
static Builder builder(TypeName type, String name, Modifier... modifiers);
static Builder builder(Type type, String name, Modifier... modifiers);
TypeName type();
String name();
CodeBlock javadoc();
List<AnnotationSpec> annotations();
Set<Modifier> modifiers();
CodeBlock initializer();
Builder toBuilder();
boolean equals(Object o);
int hashCode();
String toString();
}
class FieldSpec.Builder {
FieldSpec.Builder addJavadoc(String format, Object... args);
FieldSpec.Builder addJavadoc(CodeBlock block);
FieldSpec.Builder addAnnotations(Iterable<AnnotationSpec> annotationSpecs);
FieldSpec.Builder addAnnotation(AnnotationSpec annotationSpec);
FieldSpec.Builder addAnnotation(ClassName annotation);
FieldSpec.Builder addAnnotation(Class<?> annotation);
FieldSpec.Builder addModifiers(Modifier... modifiers);
FieldSpec.Builder initializer(String format, Object... args);
FieldSpec.Builder initializer(CodeBlock codeBlock);
FieldSpec build();
}Install with Tessl CLI
npx tessl i tessl/maven-com-palantir-javapoet--javapoet@0.11.0docs