用BSF + Beanshell使Java程序能够运行字符串形式的代码(转载)

 

BSF(Bean Scripting Framework)最初是IBM Alpha工作组的项目,后来贡献给了Apache,BSF使Java能够更好的与各种流行脚本语言整合,实现不同语言之间的交互功能。Beanshell是一种完全符合Java语法的脚本语言。

运行以下代码需下载相关jar包(http://jakarta.apache.org/bsf/http://www.beanshell.org/

PS:新浪博客将“eval”视为危险角本,所以将下面例子里的所有“eval”方法替换成了“eval_r” 

 

//测试类

public class BSFScript extends Scriptable {

    public static void main(String[] args) {

       try {

           // 根据(3 > 2)返回true/false

           Object flag = bsfEngine.eval_r(defaultEngine, 0, 0, "(3 > 2)");

           if (Boolean.valueOf(flag.toString())) {

              System.out.println("do something...");

           }

 

           AuthorBean bean = new AuthorBean();

           variableMap.put("author", "lijingcheng1984");

           // variableMap和AuthorBean类名在随后执行角本时,会预先注册到BSF管理器中,

           // 所以author和AuthorBean可以在角本中作为变量使用。

           String expr = "if(AuthorBean.getBlogAddress().lastIndexOf(author) != -1) "

                  + "{ return AuthorBean.getBlogAddress(); }";

           System.out.println(bean.getScriptable().eval_r(expr));

       } catch (Exception e) {

           System.out.println(e.getMessage());

       }

    }

}

 

//此接口用于标识继承类支持角本化

public interface IScriptableToken {

    Scriptable getScriptable();

}

 

//可角本化的Java Bean类

public class AuthorBean implements IScriptableToken {

    public String getBlogAddress() {

       return "http://blog.sina.com/lijingcheng1984";

    }

   

    @Override

    public Scriptable getScriptable() {

       return new Scriptable(this);

    }

}

 

import java.util.Hashtable;

import java.util.Map;

 

import org.apache.bsf.BSFEngine;

import org.apache.bsf.BSFException;

import org.apache.bsf.BSFManager;

 

//角本化功能类

public class Scriptable {

    private static BSFManager mgr;

    protected static BSFEngine bsfEngine;

    protected static Map<String, Object> variableMap;

    private IScriptableToken scriptableObject;

    protected static final String defaultEngine = "beanshell";

 

    public Scriptable() {

 

    }

 

    public Scriptable(IScriptableToken scriptableObject) {

       this.scriptableObject = scriptableObject;

    }

 

    static {

       try {

           mgr = new BSFManager();

           bsfEngine = mgr.loadScriptingEngine(defaultEngine);

           variableMap = new Hashtable<String, Object>();

       } catch (BSFException e) {

           e.printStackTrace();

       }

    }

 

    //注册并绑定对象,以后可以通过key值访问此对象

    private void putVariable(String key, Object value) throws BSFException {

       for (final Map.Entry<String, Object> entry : variableMap.entrySet()) {

           mgr.declareBean(entry.getKey(), entry.getValue(), entry.getValue()

                  .getClass());

       }

       mgr.declareBean(key, value, value.getClass());

    }

 

    //执行角本并提供返回值

    protected Object eval_r(final String expr) {

       try {

           String className = scriptableObject.getClass().getName();

           String key = className.substring(className.lastIndexOf(".") + 1);

           putVariable(key, scriptableObject);

           return mgr.eval_r(defaultEngine, "", 0, 0, expr);

       } catch (final BSFException e) {

           return e.getMessage();

       }

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值