用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();
}
}
}
用BSF + Beanshell使Java程序能够运行字符串形式的代码(转载)的更多相关文章
- 如何利用 JConsole观察分析Java程序的运行,进行排错调优
原文链接:http://jiajun.iteye.com/blog/810150 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能 ...
- 利用jdk自带的运行监控工具JConsole观察分析Java程序的运行
利用jdk自带的运行监控工具JConsole观察分析Java程序的运行 原文链接 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能 ...
- JDK自带的运行监控工具JConsole观察分析Java程序的运行
原文地址:https://blog.csdn.net/libaolin198706231987/article/details/55057149 一.JConsole是什么 从Java 5开始 引入了 ...
- 如何利用JConsole观察分析JAVA程序的运行
今天在CSDN看到一朋友说关于对JVM的研究,正好看到有关于jconsole的文章,特意找了下资料,留着备用 ps:jconsole建议用JDK1.6的1.5的界面太简陋了,另外还有增强版jvisua ...
- WebAssembly,可以作为任何编程语言的编译目标,使应用程序可以运行在浏览器或其它代理中——浏览器里运行其他语言的程序?
Mozilla.谷歌.微软和苹果已经决定开发一种面向Web的二进制格式.该格式名为WebAssembly,可以作为任何编程语言的编译目标,使应用程序可以运行在浏览器或其它代理中. 几年前,我们在Inf ...
- 使用JConsole观察分析Java程序的运行(转)
一.JConsole是什么 从Java 5开始 引入了JConsole.JConsole是一个内置Java性能分析器,可以从命令行或在GUI shell中运行.您可以轻松地使用JConsole(或者, ...
- java拾遗4----一个简单java程序的运行全过程
简单说来,一个java程序的运行需要编辑源码.编译生成class文件.加载class文件.解释或编译运行class中的字节码指令. 下面有一段简单的java源码,通过它来看一下java程序的运行流程: ...
- 如何利用JConsole观察分析Java程序的运行并进行排错调优_java
如何利用JConsole观察分析Java程序的运行并进行排错调优_java 官方指导 use jconsole use jmx technology
- 2. Java程序的运行机制
一.完成一个Java程序的流程:编辑Java源代码→编译Java程序→运行Java程序 1. 在记事本中编写Java程序,然后保存为.java类型文件(Java源文件) 2. 使用javac命令将源文 ...
随机推荐
- Ubuntu-16.04安装Xdebug-2.2.5及相关介绍
Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况.在日常开发中,我们会使用如 print_r() var_dump()等函数来进行调 ...
- hdu5076
好题,首先观察可得w[i][j]选择只有可能两种,一种比阀值大,一种比阀值小 比阀值大就一定选满足条件最大的w,比阀值小同样一定选满足条件最大的w 那么一个最小割模型就呼之欲出了,注意w可能是负数那么 ...
- 利用ResultFilter实现asp.net mvc3 页面静态化
为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过mvc提供的过滤器扩展点实现页面内容 ...
- 暴力 【p4098】[HEOI2013]ALO
Description Welcome to ALO ( Arithmetic and Logistic Online).这是一个 VR MMORPG, 如名字所见,到处充满了数学的谜题 现在你拥有 ...
- 01、Mecanim动画系统
序言:Mecanim动画系统是Unity4.0之后退出的新版动画系统,非常适合人类动画系统.本文是作为自己的学习来讲解的, 可能会有些啰嗦,但尽量把自己的坑都为大家列出来,让大家理解透彻. 一.文件的 ...
- leetcode122 Best Time to Buy and Sell Stock
题意:有一个数组,第i个数据代表的是第i天股票的价格,每天只能先卖出再买进(可以不卖出也可以不买进),求最大收益. 思路:自己去弄几个数组比划比划就知道了,比如[1,2,5,3,6],第一天买进,第二 ...
- SSH框架的简单含义
典型的J2EE三层结构,分为表现层.中间层(业务逻辑层)和数据服务层.三层体系将业务规则.数据访问及合法性校验等工作放在中间层处理.客户端不直接与数据库交互,而是通过组件与中间层建立连接,再由中间层与 ...
- [Codeforces 32E] Hide-and-Seek
Brief Intro: 给两个人的坐标,一堵墙和一面镜子,询问两人能否看见对方 Solution: 一道以分类讨论为主的计算几何题, 分别讨论两人坐标连线是否经过墙/镜子即可, 难点在于如何求出点x ...
- python3开发进阶-Django框架中的ORM的常用(增,删,改,查)操作
阅读目录 如何在Django终端打印SQL语句 如何在Python脚本中调用Django环境 操作方法 单表查询之神奇的下划线 ForeignKey操作 ManyToManyField 聚合查询和分组 ...
- 【MySQL笔记】SQL语言四大类语言
SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL. 1. 数据查询语言DQL 数据查询语言DQL基本结构是由SELECT子句,FROM子句, ...