I'm trying to compile and load a class at runtime, without knowing the package of the class. I do know that the class should comply with an interface, and the location of the source, (and hence the class name). I'm trying the following:
/* Compiling source */
File root = new File("scripts");
File sourceFile = new File(root, "Test.java");
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, null, null, sourceFile.getPath());
where the Test.java file looks something like
import foo.Itest;
public class Test implements Itest{
...
}
And I get a cannot find symbol symbol : class Itest
error from the compiler. How do I provide the compiler with the interface (which has already been loaded) to avoid this error?
[EDIT - RESOLVED]: The error came from the fact the the interface was ITest
and the source referred to an Itest
interface.
It seems likely that the
compiler.run()
is running externally and needs the class path to be set. Have you tried to pass it a suitable class path setting using the last parameterargs
to therun()
call? Perhaps that's whyToolProvider.getSystemToolClassLoader()
.This stackoverflow post might also help you.
Not sure if this is what you're looking for but, as mentioned by @Phil here, you could try to pass a classpath argument in your
compiler.run
method.jOOR supports compiling classes in memory. Your code could look like this:
Behind the scenes,
javax.tools.JavaCompiler
is used, but the API is simpler for every day use cases.(Disclaimer: I work for the company behind jOOR)
Have you considered generating your class with javassist or something like that?