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.
Dynamic compilation is a process used by some programming language implementations to gain performance during program execution. Although the technique originated in Smalltalk, the best-known language that uses this technique is Java.
The Dynamic Code Evolution Virtual Machine (DCE VM) is a modification of the Java HotSpot™ VM that allows unlimited redefinition of loaded classes at runtime. The current hotswapping mechanism of the HotSpot™ VM allows only changing method bodies.
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 parameter args
to the run()
call? Perhaps that's why ToolProvider.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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With