java 脚本解释器

java 脚本解释器

如果用过python,就知道它有了command line 工具,比如你输入 print 'a' ,该工具输出:a,好处是便于快速学习python 语法。

其实java也可以做到。

下面是一个java 脚本解释器的helloword版本,思路如下:

1动态创建一个Temp.java类文件,里面只有一个excute方法,把从控制台输入 的字符串加入到类方法中,比如for(int i=0;i<10;i++){System.out.println(i);}。

2再利用com.sun.tools.javac.Main.compile 动态编译Temp.java 生成class

3将Temp.class载入到jvm

4生成object实例,利用反射执行excute方法

说明,这只是个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;
        }
   }
}

你可能感兴趣的:(java 脚本解释器)