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();

}

}

}

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

  1. 如何利用 JConsole观察分析Java程序的运行,进行排错调优

    原文链接:http://jiajun.iteye.com/blog/810150 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能 ...

  2. 利用jdk自带的运行监控工具JConsole观察分析Java程序的运行

    利用jdk自带的运行监控工具JConsole观察分析Java程序的运行 原文链接 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能 ...

  3. JDK自带的运行监控工具JConsole观察分析Java程序的运行

    原文地址:https://blog.csdn.net/libaolin198706231987/article/details/55057149 一.JConsole是什么 从Java 5开始 引入了 ...

  4. 如何利用JConsole观察分析JAVA程序的运行

    今天在CSDN看到一朋友说关于对JVM的研究,正好看到有关于jconsole的文章,特意找了下资料,留着备用 ps:jconsole建议用JDK1.6的1.5的界面太简陋了,另外还有增强版jvisua ...

  5. WebAssembly,可以作为任何编程语言的编译目标,使应用程序可以运行在浏览器或其它代理中——浏览器里运行其他语言的程序?

    Mozilla.谷歌.微软和苹果已经决定开发一种面向Web的二进制格式.该格式名为WebAssembly,可以作为任何编程语言的编译目标,使应用程序可以运行在浏览器或其它代理中. 几年前,我们在Inf ...

  6. 使用JConsole观察分析Java程序的运行(转)

    一.JConsole是什么 从Java 5开始 引入了JConsole.JConsole是一个内置Java性能分析器,可以从命令行或在GUI shell中运行.您可以轻松地使用JConsole(或者, ...

  7. java拾遗4----一个简单java程序的运行全过程

    简单说来,一个java程序的运行需要编辑源码.编译生成class文件.加载class文件.解释或编译运行class中的字节码指令. 下面有一段简单的java源码,通过它来看一下java程序的运行流程: ...

  8. 如何利用JConsole观察分析Java程序的运行并进行排错调优_java

    如何利用JConsole观察分析Java程序的运行并进行排错调优_java 官方指导  use jconsole use jmx technology

  9. 2. Java程序的运行机制

    一.完成一个Java程序的流程:编辑Java源代码→编译Java程序→运行Java程序 1. 在记事本中编写Java程序,然后保存为.java类型文件(Java源文件) 2. 使用javac命令将源文 ...

随机推荐

  1. hdu5790

    都快忘了在这类题的经典做法了…… 将字符串一个个的插入字典树,在字典树维护好有该前缀串s的最大编号字符串j,我们记作j控制了前缀串s 对于当前的第i个字符串,维护此时有当前每个字符串控制了多少个前缀串 ...

  2. 【cocos2d-js官方文档】七、CCFileUtils

    Web引擎 CCFileUtils.js在Web引擎中已经被删除了,原因是FileUtils在原生平台中的文件检索功能在Web端是无法实现的. 二进制文件获取的方法被转移到了cc.loader.loa ...

  3. 识别浏览器的JavaScript引擎的方法

    答案来自StackOverflow,打开这个网页http://jsbin.com/opuvas即可,这个网页也是答题者自己写的. 二维码是这个网址.网页内有统计访问量,作者想知道对多少人有用,建议尊重 ...

  4. python3爬虫爬取猫眼电影TOP100(含详细爬取思路)

    待爬取的网页地址为https://maoyan.com/board/4,本次以requests.BeautifulSoup css selector为路线进行爬取,最终目的是把影片排名.图片.名称.演 ...

  5. Oracle SQL*Loader commit point tips

    http://www.dba-oracle.com/t_sql_loader_commit_frequency.htm - Question:  Can I control the commit fr ...

  6. HashCode()的作用

    在实现Hash算法的集合里面,例如HashSet,该集合不能存放相同的数据,HashSet会根据对象的equals()和hashCode()方法来判断要存放的数据是否已经存在.Hash算法把HashS ...

  7. [BZOJ4530]大融合

    LCT维护子树信息 维护两个子树信息,$vinf_x$表示节点$x$的所有轻儿子子树信息,$inf_x$表示以$x$为根的LCT子树(包含虚边)的信息 对$vinf$: access时,断开$x$的原 ...

  8. 【贪心】bzoj3721 PA2014 Final Bazarek

    考虑不限制奇偶的情况,那就是直接排序取前k个的和. 加上奇偶限制:若排序后的前k个的和是偶数,则“显然地”:将其中的最小的奇数替换成未被选择的数中最大的偶数 或者 将其中的最小的偶数替换成未被选择的数 ...

  9. 5.7(java学习笔记)Vector、Enumeration

    一.Vector Vector类实现一个可扩展的数组对象.与数组一样,它包含可以使用整数索引访问. 它的基本操作方法add(int index, E element),get(int index),i ...

  10. Matlab中struct的用法

    struct在matlab中是用来建立结构体数组的.通常有两种用法: s = struct('field1',{},'field2',{},...)  这是建立一个空的结构体,field1,field ...