Chinaunix首页 | 论坛 | 博客
  • 博客访问: 609716
  • 博文数量: 69
  • 博客积分: 1891
  • 博客等级: 上尉
  • 技术积分: 1359
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-20 23:38
文章分类

全部博文(69)

文章存档

2012年(46)

2011年(23)

分类: Java

2012-09-05 15:41:57

3、实现一个简单的java shell
 接下来实现一个有趣的功能,java是编译执行的语言。但是我们可以通过动态生成class文件,然后加载这个class文件进行执行的方式来实现伪解释执行的功能。
          要实现这个功能,主要要完成以下几个内容:
          1、从控制台读入Java代码
          2、把读入的Java代码封装成一个Java类和对应的方法
          3、编译组装好的Java类生成class文件,如果有语法错误,则给出提示
          4、装载上面的class文件,然后调用对应的方法。

          以下是包装和执行Java代码的方法:

点击(此处)折叠或打开

  1. public static Object javaEval(String src)
  2.                    throws CannotCompileException, IllegalArgumentException,
  3.                   SecurityException, IllegalAcces***ception,
  4.                   InvocationTargetException {
  5.              //1、生成一个随机的Class名称
  6.             ClassPool pool = ClassPool. getDefault();
  7.             CtClass cc = pool.makeClass( "Eval$Class" + System.currentTimeMillis()
  8.                         + Math. random());
  9.             StringBuilder sb = new StringBuilder();
  10.              //2、把src 放入run方法体里
  11.             sb.append( "public static Object run(Object[] args){" );
  12.             sb.append(src);
  13.             sb.append( "return null;}");
  14.              //3、把生成的方法加入到Class上
  15.             CtMethod cm = CtNewMethod. make(sb.toString(), cc);
  16.             cc.addMethod(cm);
  17.              //4、调用生成的方法
  18.              return cc.toClass().getMethods()[0].invoke( null, (Object)null );

  19.       }
 要实现一个shell,我们还需要不断的从控制台读入命令执行,以下代码实现这个功能:

点击(此处)折叠或打开

  1. public static void main(String [] args) throws Exception, SecurityException, CannotCompileException, IllegalAcces***ception, InvocationTargetException{

  2.             BufferedReader br = new BufferedReader( new InputStreamReader(System.in ));
  3.             String line = null;
  4.              while((line = br.readLine()) != null ){
  5.                    //exit为退出命令
  6.                    if(line.equalsIgnoreCase( "exit"))
  7.                          break;
  8.                    try{
  9.                          javaEval(line);
  10.                   } catch(CannotCompileException e){
  11.                          //输出编译错误信息
  12.                         System. err.println(e.getMessage());
  13.                   }
  14.                   System. out.println();
  15.             }
  16.             br.close();
  17.       }
       运行上面的代码,执行结果如下:
         这样我们就完成了一个java的伪shell终端,不过这个终端的功能还很简陋,只能一行一行的代码进行执行。不过java现在有了一个开源的解释器,叫BeanShell,具体参考
阅读(3821) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~