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; } }