Better than using reflection to call the method you want, you might want to declare an interface
that your class would extend, such as:
package ccjmne;
public interface JobRunner {
public void runJob(final String[] args);
}
... and make your class implement that interface
:
File: /home/eric/stackoverflow/A.java
package stackoverflow;
public class A implements ccjmne.JobRunner {
public void runJob(final String args[]) {
for(final String str : args) {
System.out.println(str);
}
}
}
And finally, load that class as follows:
final Class<JobRunner> cls = (Class<JobRunner>) Class.forName("stackoverflow.A", true, classLoader);
Note that I know that I've a JobRunner
here.
Thus, I can simply do:
cls.newInstance().runJob("Hello world!".split(" "));
... And you're done!
Sample working code:
package ccjmne;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import javax.tools.JavaCompiler;
import javax.tools.ToolProvider;
public class JobRunnerTest {
public static void main(final String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, MalformedURLException {
final JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
final File root = new File("/home/eric/");
compiler.run(null, null, null, root + "/stackoverflow/A.java");
final URLClassLoader classLoader = URLClassLoader.newInstance(new URL[] { root.toURI().toURL() });
final Class<JobRunner> cls = (Class<JobRunner>) Class.forName("stackoverflow.A", true, classLoader);
cls.newInstance().runJob("Hello world!".split(" "));
}
}
Output:
Hello
world!