With UnitSourceGenerator you can generate source code and store it on the drive. first of all, we must add to our pom.xml the following dependency:
<dependency> <groupId>org.burningwave</groupId> <artifactId>core</artifactId> <version>12.64.3</version> </dependency>
… And to use Burningwave Core as a Java module, add the following to your module-info.java
:
requires org.burningwave.core;
Assuming this class as example:
package source.generation.test; import java.util.Arrays; import java.util.List; public class GeneratedClass { private List<String> words; public GeneratedClass(String... words) { this.words = Arrays.asList(words); } public void print() { System.out.print(String.join(" ", words)); } public static void main(String[] args) { new GeneratedClass(args).print(); } }
… The relative code to generate and store it will be:
package source.generation.test; import java.lang.reflect.Modifier; import java.util.Arrays; import java.util.List; import org.burningwave.core.classes.ClassSourceGenerator; import org.burningwave.core.classes.FunctionSourceGenerator; import org.burningwave.core.classes.GenericSourceGenerator; import org.burningwave.core.classes.TypeDeclarationSourceGenerator; import org.burningwave.core.classes.UnitSourceGenerator; import org.burningwave.core.classes.VariableSourceGenerator; public class SourceGenerationTester { public static UnitSourceGenerator generate() { return UnitSourceGenerator.create(SourceGenerationTester.class.getPackage().getName()) .addClass( ClassSourceGenerator.create(TypeDeclarationSourceGenerator.create("GeneratedClass")) .addField( VariableSourceGenerator.create( TypeDeclarationSourceGenerator.create(List.class) .addGeneric(GenericSourceGenerator.create(String.class)), "words" ) ) .addConstructor( FunctionSourceGenerator.create().addParameter( VariableSourceGenerator.create( TypeDeclarationSourceGenerator.create(String.class) .setAsVarArgs(true), "words" ) ).addBodyCodeLine("this.words = Arrays.asList(words);").useType(Arrays.class) ) .addMethod( FunctionSourceGenerator.create("print") .addModifier(Modifier.PUBLIC).setReturnType(void.class) .addBodyCodeLine( "System.out.println(\"\\n\\t\" + String.join(\" \", words) + \"\\n\");" ) ) .addMethod( FunctionSourceGenerator.create("main") .addModifier(Modifier.PUBLIC | Modifier.STATIC) .setReturnType(void.class) .addParameter(VariableSourceGenerator.create(String[].class, "args")) .addBodyCodeLine("new GeneratedClass(args).print();") ) ); } public static void main(String[] args) { UnitSourceGenerator unitSG = SourceGenerationTester.generate(); unitSG.storeToClassPath(System.getProperty("user.home") + "/Desktop/sources"); System.out.println("\nGenerated code:\n" + unitSG); } }
Once the sources have been generated you can also compile them at runtime: to do this follow this guide.
BackgroundExecutor
ClassFactory
ClassHunter
- In depth look to and configuration guide
- USE CASE: how to retrieve all classes of the classpath
- USE CASE: how to retrieve all classes that implement one or more interfaces
- USE CASE: finding all classes that extend a base class
- USE CASE: how to find all classes in a package
- USE CASE: Finding all classes for module name (Java 9 and later)
- USE CASE: finding all annotated classes
- USE CASE: how to scan classes for specific annotations and collect their values
- USE CASE: how to search for all classes with a constructor that takes a specific type as first parameter and with at least 2 methods that begin for a given string
- USE CASE: how to search for all classes with methods whose name begins for a given string and that takes a specific type as its first parameter
- USE CASE: finding all classes that have at least 2 protected fields
ClassPathHunter
CodeExecutor
FileSystemItem
FunctionalInterfaceFactory
IterableObjectHelper
JavaMemoryCompiler
PropertyAccessor
UnitSourceGenerator