在路上

路上有惊慌,路上有理想

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  28 Posts :: 1 Stories :: 10 Comments :: 0 Trackbacks

如果用过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;
        }
   }
}

posted on 2010-08-30 22:29 阮步兵 阅读(398) 评论(0)  编辑  收藏 所属分类: Java

只有注册用户登录后才能发表评论。


网站导航: