java - Dynamically recompile and reload a class -
java - Dynamically recompile and reload a class -
i'm building server in java can receive java source files, , should dynamically compile using javacompiler , load class. problem if server receive file same name different content, still load previous class , gave same outputs. i've noticed answers suggesting creating superclass class i'm trying load , using different classloader, still case if java source file dynamically sent server?
here's compile , load methods in fileserver.java:
public final static int file_size = 1022386; public static void compile(string filename) { // save source in .java file. file sourcefile = new file(filename); // compile source file. javacompiler compiler = toolprovider.getsystemjavacompiler(); diagnosticcollector <javafileobject> diagnostics = new diagnosticcollector<javafileobject>(); standardjavafilemanager filemanager = compiler.getstandardfilemanager(diagnostics, null, null); file [] files = new file [] {sourcefile}; iterable<? extends javafileobject> compilationunits = filemanager.getjavafileobjectsfromfiles(arrays.aslist(files)); string [] compileoptions = new string[] {"-classpath", "runtime.jar"}; iterable<string> compilationoptions = arrays.aslist(compileoptions); javacompiler.compilationtask task = compiler.gettask(null, filemanager, diagnostics, compilationoptions, null, compilationunits); task.call(); } public static void compileload (string filename) { compile(filename); string classname = ""; int = 0; while(filename.charat(i) != '.') { classname += filename.charat(i); i++; } classloader classloader = fileserver.class.getclassloader(); // dynamically load class , invoke main method. seek { //class<?> cls = class.forname(classname); class<?> cls = classloader.loadclass(classname); method meth = cls.getmethod("main", string[].class); string[] params = null; meth.invoke(null, (object) params); } grab (exception e) { e.printstacktrace(); } }
the problem normal behaviour classloader.loadclass or class.forname homecoming existing class if loaded previously. won't @ class file see if has changed.
(there reason this. basically, identity of object type in java equivalent tuple consisting of classes qualified name, , class loader. means jvm cannot (and not) allow classloader "define" 2 classes same name. if seek create happen, think defineclass method give class object loaded class.)
so ...
in order accomplish trying achieve, need create new classloader each time want load new version of class.
java java-compiler-api dynamic-class-loaders reloading
Comments
Post a Comment