专业的JAVA编程教程与资源

网站首页 > java教程 正文

BeanShell:动态执行java代码(java动态运行一段代码)

temp10 2024-10-29 16:38:45 java教程 15 ℃ 0 评论

背景

最初接触这个BeanShell是在JMeter中的BeanShell脚本配置中,当时并没有当回事儿,最近又接触了一个网关类的项目,这个网关类的项目实现了异构系统之间通讯转换,报文转换处理,完全基于GUI页面或XML文件进行最大化的配置,而在XML文件中可以对报文转化处理过程中需要特别指定的字段处理进行JAVA代码配置。大体样子如下:

<xml>
  <msg>
    <field name="tag" length="50">
      <![CDATA[[
        import xxxx;
        return message.substring(0)+"xxx";
      ]]>
    </field>
  </msg>
</xml>

其中CDATA部分明显就是一块java代码,这一块实现方式引起了我的兴趣,经过翻找底层实现,BeanShell再次进入视野。

BeanShell:动态执行java代码(java动态运行一段代码)

经过简单的查找文档,整理了以下简要的用法作为记录,基本够用。

BeanShell基础用法

1、创建项目并添加maven依赖

<dependency>
  <groupId>org.apache-extras.beanshell</groupId>
  <artifactId>bsh</artifactId>
  <version>2.0b6</version>
</dependency>

2、实例1,构建main方法,添加如下代码

// 创建interpreter构造方法对象
Interpreter i = new Interpreter();
// 设置变量
i.set("foo", 5);
i.set("date", new Date());
// 获取变量
Date date = (Date) i.get("date");
// 触发一个运算
i.eval("bar = foo*10");
System.out.println(i.get("bar"));

其中:Interpreter即是BeanShell的主入口

3、如果上述实例还不能解决实际问题的话,下面一个就是可以让人浮想联翩了

// 创建interpreter构造方法对象
Interpreter i = new Interpreter();
// 设置变量,这个地方既可以是数字也可以是字符串,没有严格的类型限制
i.set("a", 5);
i.set("b", 6);
Object ret = i.source("beanshell/source.bsh");
System.out.println(ret);

其中source.bsh文件内容如下:

add( a, b ) {
 return a + b;
}
foo = add(a, b); 
return foo ;

最终System.out的结果为11,如果设置变量的位置为字符串,则结果为两个字符串的拼接。

该文件的内容,可以是java文件,可以通过import引入需要的处理类,完成更多功能。

应用场景

能想到的应用场景:

  • JMeter工具
  • 高度配置化的工具中,处理一些特殊信息;

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表