Roaster is a library that allows easy parsing and formatting of java source files. Roaster introduces a fluent interface to manipulate Java source files, like adding fields, methods, annotations and so on.
Below is one example:
import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.Date;
import org.apache.commons.io.FileUtils;
import org.jboss.forge.roaster.Roaster;
import org.jboss.forge.roaster.model.source.JavaClassSource;
public class POJOGenerator {
public static void main(String[] args) throws IOException {
//create an empty instance
final JavaClassSource javaClass = Roaster.create(JavaClassSource.class);
//set the package name, and Java class name
javaClass.setPackage("demo.JavaCodeGenerator.roaster").setName("PersonPojo");
//add interface, can be one or more
javaClass.addInterface(Serializable.class);
//extend an abstract class
javaClass.extendSuperType(Date.class);
//add a Long/private/static/final Long field, with value '-1L'
javaClass.addField()
.setName("serialVersionUID")
.setType("long")
.setLiteralInitializer("-1L")
.setPrivate().setStatic(true).setFinal(true);
//add a String property, setter/getter functions are generated
javaClass.addProperty(String.class, "firstName");
//add an Integer property, final and not exposed
javaClass.addProperty(Integer.class, "id").setMutable(true).setAccessible(false);
//add a new property with class 'demo.JavaCodeGenerator.App', an Import line is added
javaClass.addProperty("demo.JavaCodeGenerator.App", "app");
//add a public constructor function,
javaClass.addMethod()
.setConstructor(true)
.setPublic()
.setBody("this.id = id;")
.addParameter(Integer.class, "id");
//add another private function
javaClass.addMethod()
.setName("increaseId")
.setPrivate()
.setBody("this.id += step;")
.addParameter("int", "step");
//check if any syntax error
if(javaClass.hasSyntaxErrors()){
System.err.println("SyntaxError: "+javaClass.getSyntaxErrors());
}
//output to file
String filePath = "src/main/java/demo/JavaCodeGenerator/roaster/PersonPojo.java";
FileUtils.forceMkdir(new File("src/main/java/demo/JavaCodeGenerator/roaster"));
FileUtils.writeStringToFile(new File(filePath), javaClass.toString());
}
}
The output class looks as below:
package demo.JavaCodeGenerator.roaster;
import java.io.Serializable;
import java.util.Date;
import demo.JavaCodeGenerator.App;
public class PersonPojo extends Date implements Serializable {
private static final long serialVersionUID = -1L;
private String firstName;
private Integer id;
private App app;
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public void setId(Integer id) {
this.id = id;
}
public App getApp() {
return app;
}
public void setApp(App app) {
this.app = app;
}
public PersonPojo(java.lang.Integer id) {
this.id = id;
}
private void increaseId(int step) {
this.id += step;
}
}