반응형
JavaFileClassLoader
import javax.tools.*;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class JavaFileClassLoader {
public static void main(String[] args) {
List<File> javaFiles = List.of(
new File("/Users/demo-user/IdeaProjects/demo-project/src/main/java/com/example/demo/DemoApplication.java"),
new File("/Users/demo-user/IdeaProjects/demo-project/src/main/java/com/example/demo/model/Demo.java")
);
List<Class<?>> classes = compileJavaFiles(javaFiles);
classes.forEach(it -> System.out.printf("%s.%s\n", it.getPackageName(), it.getName()));
}
private static List<Class<?>> compileJavaFiles(List<File> javaFiles) {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, StandardCharsets.UTF_8);
Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(javaFiles);
JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits);
task.call();
return javaFiles.stream()
.map(File::getAbsolutePath)
.map(it -> Pattern.compile("src/main/java/(.*)").matcher(it))
.filter(Matcher::find)
.map(it -> it.group(1))
.map(it -> it.replaceAll("/", "."))
.map(it -> it.replace(".java", ""))
.map(packageName -> {
try {
return Thread.currentThread().getContextClassLoader().loadClass(packageName);
} catch (ClassNotFoundException e) {
throw new IllegalStateException(e);
}
})
.collect(Collectors.toList());
}
}
javacopy
반응형
'Development > Java' 카테고리의 다른 글
[Java] HtmlUnit (8) | 2024.10.06 |
---|---|
[Java] Snowflake (0) | 2023.11.02 |
[Java] Mockito (0) | 2022.06.23 |
[Java] Random (0) | 2022.06.21 |
[Java] Cipher(RSA, AES) (0) | 2022.04.27 |