Core
An advanced and highly optimized Java library to build frameworks: it's useful for scanning class paths, generating classes at runtime, facilitating the use of reflection, scanning the filesystem, executing stringified source code and much more...
Install / Use
/learn @burningwave/CoreREADME
Burningwave Core 
<a href="https://www.burningwave.org">
<img src="https://raw.githubusercontent.com/burningwave/burningwave.github.io/main/logo.png" alt="logo.png" height="180px" align="right"/>
</a>
Burningwave Core is an advanced, free and open source Java frameworks building library and it is useful for scanning class paths, generating classes at runtime, facilitating the use of reflection, scanning the filesystem, executing stringified source code, iterating collections or arrays in parallel, executing tasks in parallel and much more...
Burningwave Core contains AN EXTREMELY POWERFUL CLASSPATH SCANNER: it’s possible to search classes by every criteria that your imagination can make by using lambda expressions; scan engine is highly optimized using direct allocated ByteBuffers to avoid heap saturation; searches are executed in multithreading context and are not affected by “the issue of the same class loaded by different classloaders” (normally if you try to execute "isAssignableFrom" method on a same class loaded from different classloader it returns false).
And now we will see:
- including Burningwave Core in your project
- generating classes at runtime and invoking their methods with and without the use of reflection
- retrieving classes of runtime class paths or of other paths through the ClassHunter
- finding where a class is loaded from
- performing tasks in parallel with different priorities
- iterating collections and arrays in parallel by setting thread priority
- reaching a resource of the file system
- resolving, collecting or retrieving paths
- retrieving placeholdered items from map and properties file
- handling privates and all other members of an object
- executing stringified source code
- getting and setting properties of a Java bean through path
- architectural overview and configuration
- other examples of using some components
- how to ask for assistance
<a name="Including-Burningwave-Core-in-your-project"></a>Including Burningwave Core in your project
To include Burningwave Core library in your projects simply use with Apache Maven:
<dependency>
<groupId>org.burningwave</groupId>
<artifactId>core</artifactId>
<version>12.66.2</version>
</dependency>
Requiring the Burningwave Core module
To use Burningwave Core as a Java module you need to add the following to your module-info.java:
requires org.burningwave.core;
<br/>
<a name="Generating-classes-at-runtime-and-invoking-their-methods-with-and-without-the-use-of-reflection"></a>Generating classes at runtime and invoking their methods with and without the use of reflection
For this purpose is necessary the use of ClassFactory component and of the sources generating components. Once the sources have been set in UnitSourceGenerator objects, they must be passed to loadOrBuildAndDefine method of ClassFactory with the ClassLoader where you want to define new generated classes. This method performs the following operations: tries to load all the classes present in the UnitSourceGenerator through the class loader, if at least one of these is not found it proceeds to compiling all the UnitSourceGenerators and uploading their classes on class loader: in this case, keep in mind that if a class with the same name was previously loaded by the class loader, the compiled class will not be uploaded. If you need more information you can:
- see a complete example about source code generators
- read this guide where you also can find a link to an example about generating classes by using libraries located outside the runtime class paths
- go here for more examples
- ask for assistance
Once the classes have been compiled and loaded, it is possible to invoke their methods in severals ways as shown at the end of the example below.
package org.burningwave.core.examples.classfactory;
import static org.burningwave.core.assembler.StaticComponentContainer.Constructors;
import java.lang.reflect.Modifier;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import org.burningwave.core.Virtual;
import org.burningwave.core.assembler.ComponentContainer;
import org.burningwave.core.assembler.ComponentSupplier;
import org.burningwave.core.classes.AnnotationSourceGenerator;
import org.burningwave.core.classes.ClassFactory;
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 RuntimeClassExtender {
@SuppressWarnings("resource")
public static void execute() throws Throwable {
UnitSourceGenerator unitSG = UnitSourceGenerator.create("packagename").addClass(
ClassSourceGenerator.create(
TypeDeclarationSourceGenerator.create("MyExtendedClass")
).addModifier(
Modifier.PUBLIC
//generating new method that override MyInterface.convert(LocalDateTime)
).addMethod(
FunctionSourceGenerator.create("convert")
.setReturnType(
TypeDeclarationSourceGenerator.create(Comparable.class)
.addGeneric(GenericSourceGenerator.create(Date.class))
).addParameter(VariableSourceGenerator.create(LocalDateTime.class, "localDateTime"))
.addModifier(Modifier.PUBLIC)
.addAnnotation(AnnotationSourceGenerator.create(Override.class))
.addBodyCodeLine("return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());")
.useType(ZoneId.class)
).addConcretizedType(
MyInterface.class
).expands(ToBeExtended.class)
);
System.out.println("\nGenerated code:\n" + unitSG.make());
//With this we store the generated source to a path
unitSG.storeToClassPath(System.getProperty("user.home") + "/Desktop/bw-tests");
ComponentSupplier componentSupplier = ComponentContainer.getInstance();
ClassFactory classFactory = componentSupplier.getClassFactory();
//this method compile all compilation units and upload the generated classes to default
//class loader declared with property "class-factory.default-class-loader" in
//burningwave.properties file (see "Overview and configuration").
//If you need to upload the class to another class loader use
