導入Java . io . io exception;
導入Java . lang . reflect . method;
導入Java . net . uri;
導入Java . net . urisynctaxexception;
導入Java . util . arrays;
導入javax . tools . Java compiler;
導入javax . tools . Java compiler . compilation task;
導入javax . tools . Java file object;
導入javax . tools . simple javafileobject;
導入javax . tools . standard javafilemanager;
導入javax . tools . tool provider;
/**
*動態編譯Java源文件
*
* @作者神獸兒
*
*/
公共類編譯器測試{
公共靜態void main(String[] args)引發異常{
String source = " public class Main { "+" public static void Main(String[]args){ "
+" system . out . println(\ " Hello World!\");"+ "} " + "}";
Java compiler compiler = tool provider . getsystemjavacompiler();
StandardJavaFileManager file manager = compiler . getstandardfilemanager(null,null,null);
StringSourceJavaObject source object = new CompilerTest。StringSourceJavaObject("Main ",
來源);
Iterable & lt?擴展JavaFileObject & gtfile objects = arrays . aslist(source object);
//獲取編譯後的類的根路徑,否則會報錯找不到該類。
string path = class . class . getclass()。getResource("/")。getPath();
Iterable & lt字符串& gtoptions = Arrays.asList("-d ",path);
//添加選項參數
//compilation task task = compiler . get task(null,fileManager,null,null,null,file objects);
compilation task task = compiler . get task(null,fileManager,null,options,null,file objects);
布爾結果= task . call();
如果(結果){
System.out.println("編譯成功。");
class loader loader = compiler test . class . get class loader();
嘗試{
Class & lt?& gtclazz = loader . load class(" Main ");
method method = clazz . get method(" main ",String[]。類);
//修改調用參數,否則會誤報參數個數。
//Object value = method . invoke(null,new Object[]{ });
Object value = method.invoke(null,new Object[]{ new String[]{ } });
System.out.println(值);
} catch(異常e) {
e . printstacktrace();
}
}
}
靜態類StringSourceJavaObject擴展了SimpleJavaFileObject {
私有字符串內容= null
public StringSourceJavaObject(字符串名稱,字符串內容)拋出URISyntaxException {
super(uri . create(" string:///"+name . replace(' . '),'/') + Kind。SOURCE.extension),
善良。來源);
this.content =內容;
}
public char sequence getCharContent(boolean ignore encodingerrors)引發IOException {
返回內容;
}
}
}