3、
实现一个简单的java shell 接下来实现一个有趣的功能,java是编译执行的语言。但是我们可以通过动态生成class文件,然后加载这个class文件进行执行的方式来实现伪解释执行的功能。
要实现这个功能,主要要完成以下几个内容:
1、从控制台读入Java代码
2、把读入的Java代码封装成一个Java类和对应的方法
3、编译组装好的Java类生成class文件,如果有语法错误,则给出提示
4、装载上面的class文件,然后调用对应的方法。
以下是包装和执行Java代码的方法:
- public static Object javaEval(String src)
- throws CannotCompileException, IllegalArgumentException,
- SecurityException, IllegalAcces***ception,
- InvocationTargetException {
- //1、生成一个随机的Class名称
- ClassPool pool = ClassPool. getDefault();
- CtClass cc = pool.makeClass( "Eval$Class" + System.currentTimeMillis()
- + Math. random());
- StringBuilder sb = new StringBuilder();
- //2、把src 放入run方法体里
- sb.append( "public static Object run(Object[] args){" );
- sb.append(src);
- sb.append( "return null;}");
- //3、把生成的方法加入到Class上
- CtMethod cm = CtNewMethod. make(sb.toString(), cc);
- cc.addMethod(cm);
- //4、调用生成的方法
- return cc.toClass().getMethods()[0].invoke( null, (Object)null );
- }
要实现一个shell,我们还需要不断的从控制台读入命令执行,以下代码实现这个功能:
- public static void main(String [] args) throws Exception, SecurityException, CannotCompileException, IllegalAcces***ception, InvocationTargetException{
- BufferedReader br = new BufferedReader( new InputStreamReader(System.in ));
- String line = null;
- while((line = br.readLine()) != null ){
- //exit为退出命令
- if(line.equalsIgnoreCase( "exit"))
- break;
- try{
- javaEval(line);
- } catch(CannotCompileException e){
- //输出编译错误信息
- System. err.println(e.getMessage());
- }
- System. out.println();
- }
- br.close();
- }
运行上面的代码,执行结果如下:
这样我们就完成了一个java的伪shell终端,不过这个终端的功能还很简陋,只能一行一行的代码进行执行。不过java现在有了一个开源的解释器,叫BeanShell,具体参考。
阅读(3890) | 评论(0) | 转发(2) |