First you need to get a collection of all of the Java source files you wish to compile so that you can pass it to the compiler.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
File packageBaseDir = new File("path/to/the/base/dir/of/the/source/files"); List<File> sourceFiles = new ArrayList<>(); public void collectSourceFiles(File packageBaseDir, List<File> sourceFiles) { File[] filesInCurrDir = packageBaseDir.listFiles(); for ( File file : filesInCurrDir ) { if ( file.isDirectory() ) { collectSourceFiles(file, sourceFiles); } else if ( file.getName().endsWith(".java") ) { sourceFiles.add(file); } } }
Now that you have all of the source files, you need to access the Java compiler to compile them.
1 2 3 4 5 6 7
void compileSourceFiles(List<File> sourceFiles) { JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); Iterable compilationUnits1 = fileManager.getJavaFileObjectsFromFiles(sourceFiles); JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, null, null, null, compilationUnits1); task.call(); }
The above code is accessing the Java compiler programmatically, using the StandardJavaFileManager to get the Java source as JavaFileObjects in order to pass to the compiler. A CompilationTask is created and then run on the source files. The source files should output to the same directory as the Java source. Now that the source is compiled, you can use a URLClassLoader to load the classes into your program.
1 2 3
URLClassLoader urlClassLoader = new URLClassLoader( new URL[]{packageBaseDir.toURI().toURL()}, null);
Then you can simply load the class and start using the standard reflection methods on it.
1 2
Class clazz = urlClassLoader.loadClass(binaryClassName); Methods[] methods = clazz.getDeclaredMethods(); // or whatever else you're interested in
Happy coding!