반응형

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());
    }
}
반응형

'Development > Java' 카테고리의 다른 글

[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
[Java] Base64  (0) 2022.04.26

+ Recent posts