如果用過(guò)python,就知道它有了command line 工具,比如你輸入 print 'a' ,該工具輸出:a,好處是便于快速學(xué)習(xí)python 語(yǔ)法。
其實(shí)java也可以做到。
下面是一個(gè)java 腳本解釋器的helloword版本,思路如下:
1動(dòng)態(tài)創(chuàng)建一個(gè)Temp.java類文件,里面只有一個(gè)excute方法,把從控制臺(tái)輸入 的字符串加入到類方法中,比如for(int i=0;i<10;i++){System.out.println(i);}。
2再利用com.sun.tools.javac.Main.compile 動(dòng)態(tài)編譯Temp.java 生成class
3將Temp.class載入到j(luò)vm
4生成object實(shí)例,利用反射執(zhí)行excute方法
說(shuō)明,這只是個(gè)test版本。
public class Test {
public static void main(String[] args)
throws IOException, ClassNotFoundException, InstantiationException,
IllegalAccessException, IllegalArgumentException, SecurityException,
InvocationTargetException, NoSuchMethodException{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while(true){
String js=reader.readLine();
OutputStream os = new FileOutputStream("Temp.java");
String tempJava="public class Temp"+
" { "+
" public void excute() "+
" { "+
js+
" } "+
" } ";
os.write(tempJava.getBytes());
os.close();
String[] compileArgs = new String[] {"Temp.java"};
com.sun.tools.javac.Main.compile(compileArgs);
URLClassLoader loader =
new URLClassLoader(new URL[]{new File(".").toURI().toURL()});
Class<?> scriptClass = loader.loadClass("Temp");
Object obj = scriptClass.newInstance();
obj.getClass().getDeclaredMethod("excute").invoke(obj);
obj=null;
}
}
}